从属性名称中检索“属性获取器”
本文关键字:获取 属性获取器 属性 检索 从属性 | 更新日期: 2023-09-27 18:35:42
我一直在使用此方法根据属性名称检索属性获取器。
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
无法绑定到目标方法,因为它的签名或安全性 透明度与委托类型的透明度不兼容。
您可以使用反射构造委托类型:
var delegateType = typeof(Func<>).MakeGenericType(propInfo.PropertyType);
var deleg = propInfo.GetMethod.CreateDelegate(delegateType, instance);
但是当然你不能静态地转换它,因为你在编译时不知道它,你需要使方法返回类型动态并返回委托而不强制转换。