从属性名称中检索“property getter”

时间:2014-12-31 10:11:14

标签: c# dynamic reflection

我一直在使用此方法根据属性的名称检索属性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

  

无法绑定到目标方法,因为它的签名或安全性   透明度与委托类型的透明度不兼容。

1 个答案:

答案 0 :(得分:2)

您可以使用Reflection:

构造委托类型
var delegateType = typeof(Func<>).MakeGenericType(propInfo.PropertyType);
var deleg = propInfo.GetMethod.CreateDelegate(delegateType, instance);

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