从属性名称中检索“属性获取器”

本文关键字:获取 属性获取器 属性 检索 从属性 | 更新日期: 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);

但是当然你不能静态地转换它,因为你在编译时不知道它,你需要使方法返回类型动态并返回委托而不强制转换。