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;
}
}
}