构造C#委托以调用继承属性getter

构造C#委托以调用继承属性getter,c#,generics,reflection,.net-core,properties,C#,Generics,Reflection,.net Core,Properties,我正在.NETCore2中构建通用的、可重用的反射C#代码,目的是存储委托以供重用,以避免大部分反射开销。此代码的第一个用例是获取属性值。我的基本问题是如何构造一个委托来调用继承类型的公共属性 我有一个类,它本质上充当目标类的反射包装器/适配器,使用泛型类型参数T作为Delegate.CreateDelegate的关键参数,如下所示: someDelegateStoredForReuse = (Func<T, object>)Delegate.CreateDelega

我正在.NETCore2中构建通用的、可重用的反射C#代码,目的是存储委托以供重用,以避免大部分反射开销。此代码的第一个用例是获取属性值。我的基本问题是如何构造一个委托来调用继承类型的公共属性

我有一个类,它本质上充当目标类的反射包装器/适配器,使用泛型类型参数T作为Delegate.CreateDelegate的关键参数,如下所示:

        someDelegateStoredForReuse = (Func<T, object>)Delegate.CreateDelegate(typeof(Func<T, object>), null, PropertyInfo.GetGetMethod());
someDelegateStoredForReuse=(Func)Delegate.CreateDelegate(typeof(Func),null,PropertyInfo.getMethod());
按照代码的结构方式,包装器/适配器实际上会围绕每个属性getter存储和重用包装器,上面的代码行就是在这里出现的。当包装器类被实例化时,它在typeof(T).GetProperties()返回的PropertyInfo对象上循环,并为每个对象构造一个属性包装器

这些都适用于类本身的公共属性,但不适用于继承的属性。传递给GetProperties()的绑定标志组合(包括BindingFlags.FlatterHierarchy和Public | NonPublic)不会返回用于此目的的继承属性

为了获取继承的属性,我已经切换到从类型的基类型获取它们,并沿着祖先行进行遍历。但是,我无法让Delegate.CreateDelegate使用此方法,因为我无法从其System.type获取祖先的泛型类型参数调用Delegate.CreateDelegate以使用继承属性的.getMethod()创建Func无效,因为t不是父/祖先类型(调用委托时会引发异常)。

我的问题将通过以下解决方案之一得到解决,至少在使用.NET Core 2时,我找不到这两种解决方案:

  • Call Delegate.CreateDelegate可创建一个工作委托,以使用未作为泛型参数传递的类型(即使用System.type)调用反射属性getter的MethodInfo

  • 在初始.GetProperties()调用中,如果返回的PropertyInfo.GetGetMethod()将返回MethodInfo,允许使用传递的继承类型的泛型类型T创建工作委托,则为继承的属性获取PropertyInfo对象


  • 我为我的罗嗦道歉,但我想说得准确一点。谢谢你的见解

    您可以使用
    Expression.GetFuncType
    生成一个带有所需通用参数的
    Func

    var delegateType = Expression.GetFuncType(property.DeclaringType, property.PropertyType);
    var getter = property.GetMethod.CreateDelegate(delegateType);
    

    你能用相应的代码片段来说明你的问题吗?有时候,阅读代码比阅读长描述要容易得多。特别是对我们这些软件人,我已经做到了。请参阅对Delegate.CreateDelegate的调用。问题是如何使用继承的类型调用Delegate.CreateDelegate。类似这样的吗?听起来像是抱怨GetProperty(字符串名称)没有返回继承的属性。你混淆了诸如“继承方法”和属性之类的术语。你是说继承财产?我们不知道T是什么,委托签名必须100%匹配,它不支持继承。@Holger re:“我们不知道T是什么”,这通常是没有约束的泛型类型的情况。;)