【问题标题】:How can I resolve the Class type for generic parameter, when the parameter value is being passed as an interface?当参数值作为接口传递时,如何解析泛型参数的类类型?
【发布时间】:2015-05-27 12:15:25
【问题描述】:

考虑一个具有以下签名的方法:

void foo(List<T> myList) ...

假设,通过使用反射,你需要构造这样一个函数,并获取T类型参数的PropertyInfo细节。调用 typeof(T).GetProperties(...) 应该可以解决问题,因此我们可以在方法中添加以下行,以获取这些详细信息。

void foo(List<T> myList)
{
    PropertyInfo[] props = 
        typeof(T).GetProperties(BindingFlags.Public 
            | BindingFlags.Instance 
            | BindingFlags.FlattenHierarchy);

    ...
}

这提供了我们需要的信息...除了T 是接口参数时,我发现props 仅包含接口属性,而不包含与列表中的类关联的属性,继承自接口。

需要明确的是,我的接口和我的类定义是公开的,我的类中的属性也是如此。

如何获取与继承接口的实际类型相关的属性,而不是严格的接口属性?

【问题讨论】:

  • 如果T是一个接口,那么myList可以包含不同实际类型的对象。
  • 是的,这不可能吗?我的实际情况是我有一个方法可以返回我需要使用的List&lt;IMyInterface&gt;。在获得列表并塑造一些类似的属性后,我需要将列表传递给一个更通用的函数(一个接受List&lt;T&gt; 的函数,我需要遍历所有属性。属性可以展平,但我需要访问所有这些,至少在接口和类定义中定义。
  • “我发现 props 只包含接口属性”——当然;泛型类型参数 T 在编译时进行评估,因此没有任何东西可以依赖于该列表的 content

标签: c# .net generics reflection


【解决方案1】:

如果您想要实际类型,您可能需要为每个项目获取它:

foreach (T t in myList)
{
    Type itemType = t.GetType();

    itemType.GetProperties(...)
    // etc.
}

您还可以为不同类型添加特定代码:

if(itemType == typeof(MyConcreteType))
{
    // do specific stuff for that type
}

【讨论】:

    【解决方案2】:

    如果您想获得包含在 List&lt;T&gt; 中的所有对象属性的平面列表,这里有一个 LINQ 解决方案:

    IEnumerable<PropertyInfo> properties =
                              myList.SelectMany(x => x.GetType()
                                                      .GetProperties(BindingFlags.Public | 
                                                                     BindingFlags.Instance));
    

    如果需要访问声明类型,可以随时查看PropertyInfo.DeclaryingType

    如果您不想要平面列表,Select 可以:

    IEnumerable<PropertyInfo[]> properties =
                                myList.Select(x => x.GetType()
                                                    .GetProperties(BindingFlags.Public | 
                                                                   BindingFlags.Instance));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-25
      • 2019-02-27
      • 2019-03-05
      • 2016-04-25
      • 1970-01-01
      • 2012-02-06
      • 2014-10-19
      • 1970-01-01
      相关资源
      最近更新 更多