获取特定开放泛型类的类的所有属性

时间:2018-01-19 15:18:37

标签: c# generics reflection

如果我有以下通用类:

public class Gen<T>
{
    public T Value { get; set; }
}

使用它的课程:

public class Thing
{
    public Gen<int> GenIntProperty { get; set; }
    public Gen<string> GenStringProperty { get; set; }
    public string NoGenericProp { get; set; }
}

使用反射,如何基于开放泛型类型Gen<T>的属性,特别是GenIntPropertyGenStringProperty

我已经尝试过各种形式的代码,但由于无法引用开放的泛型类型,我一直在遇到这样的错误。

  

使用泛型类型&#39; UserQuery.Gen&#39;需要1个类型参数

var genProps = typeof(Thing).GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(pi => pi.PropertyType == typeof(Gen));

1 个答案:

答案 0 :(得分:3)

您需要获取属性类型的泛型类型定义,并将其与开放泛型类型进行比较:

var genProps = typeof(Thing)
    .GetProperties(BindingFlags.Public | BindingFlags.Instance)
    .Where(pi => pi.PropertyType.IsGenericType && pi.PropertyType.GetGenericTypeDefinition() == typeof(Gen<>));