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 { /// /// DynamicMethodMemberAccessor /// public class DynamicMethodMemberAccessor : IMemberAccessor { private static ConcurrentDictionary classAccessors = new ConcurrentDictionary(); /// /// 获取属性 /// public Func OnGetProperties { get; set; } /// /// 获取字段 /// public Func OnGetFieldInfes { get; set; } /// public object GetValue(object instance, string memberName) { return FindClassAccessor(instance).GetValue(instance, memberName); } /// 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; } } }