我一直在使用此方法根据属性的名称检索属性getter。
public static Func<object> GetGetterFromProperty(object instance, string propertyName)
{
var propInfo = instance.GetType().GetTypeInfo().GetDeclaredProperty(propertyName);
var deleg = propInfo.GetMethod.CreateDelegate(typeof(Func<object>), instance);
var action = (Func<object>)deleg;
return action;
}
它返回Func<object>
,因为该属性的类型仅在运行时可用。
当属性是引用类型时,它完美地运行,但仅。当它是一个值类型(如int)时,它会抛出System.ArgumentException
无法绑定到目标方法,因为它的签名或安全性 透明度与委托类型的透明度不兼容。
答案 0 :(得分:2)
您可以使用Reflection:
构造委托类型var delegateType = typeof(Func<>).MakeGenericType(propInfo.PropertyType);
var deleg = propInfo.GetMethod.CreateDelegate(delegateType, instance);
但是当然你不能静态地转换它,因为你在编译时不知道它,你需要使方法返回类型动态并返回委托而不进行转换。