【问题标题】:C# reflection generic property typeC# 反射泛型属性类型
【发布时间】:2016-05-10 23:21:12
【问题描述】:

假设我有这样的课程:

public class TestClass <T>
{
    public T Prop { get; set; }
}

我试图确定属性类型是T,而不是传递的实际类型,例如int 为了更清楚一点:

TestClass<int> tc=new TestClass<int>();
tc.GetType().GetProperty("prop").PropertyType.Name; //this returns int, but I need "T"

【问题讨论】:

    标签: c# reflection properties


    【解决方案1】:

    当您创建TestClass&lt;int&gt; 实例时,您有一个具体化的泛型类型 - 属性 int,而不是T

    要获取实际的泛型类型,您可以使用GetGenericTypeDefinition

    var genericType = tc.GetType().GetGenericTypeDefinition();
    var typeName = genericType.GetProperty("Prop").PropertyType.Name;
    

    如果你想区分实际类型和泛型类型参数,你可以使用Type.IsGenericParameter

    genericType.GetProperty("Prop").PropertyType.IsGenericParameter // true
    

    【讨论】:

    • 谢谢,这正是我所需要的。我大概终于明白GetGenericTypeDefinition()
    【解决方案2】:

    请注意,如果您使用的是 C# 6,并且在它的定义类中需要泛型类型参数的名称,您可以完全不使用反射:

    var name = nameof(T);  // "T"
    

    如果您需要在其类之外使用泛型类型参数的名称,则需要使用反射(请参阅Luaan's answer。)

    【讨论】:

      猜你喜欢
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多