Unity Udexreal开发插件包
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

62 lines
2.0 KiB

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace TouchSocket.Core
{
/// <summary>
/// DynamicMethodMemberAccessor
/// </summary>
public class DynamicMethodMemberAccessor : IMemberAccessor
{
private static ConcurrentDictionary<Type, IMemberAccessor> classAccessors = new ConcurrentDictionary<Type, IMemberAccessor>();
/// <summary>
/// 获取属性
/// </summary>
public Func<Type, PropertyInfo[]> OnGetProperties { get; set; }
/// <summary>
/// 获取字段
/// </summary>
public Func<Type, FieldInfo[]> OnGetFieldInfes { get; set; }
/// <inheritdoc/>
public object GetValue(object instance, string memberName)
{
return FindClassAccessor(instance).GetValue(instance, memberName);
}
/// <inheritdoc/>
public void SetValue(object instance, string memberName, object newValue)
{
FindClassAccessor(instance).SetValue(instance, memberName, newValue);
}
private IMemberAccessor FindClassAccessor(object instance)
{
var typekey = instance.GetType();
if (!classAccessors.TryGetValue(typekey, out IMemberAccessor classAccessor))
{
MemberAccessor memberAccessor = new MemberAccessor(instance.GetType());
if (this.OnGetFieldInfes != null)
{
memberAccessor.OnGetFieldInfes = this.OnGetFieldInfes;
}
if (this.OnGetProperties != null)
{
memberAccessor.OnGetProperties = this.OnGetProperties;
}
memberAccessor.Build();
classAccessor = memberAccessor;
classAccessors.TryAdd(typekey, classAccessor);
}
return classAccessor;
}
}
}