C# 反射泛型属性类型

本文关键字:类型 属性 泛型 反射 | 更新日期: 2023-09-27 18:32:48

>假设我有这样的类:

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# 反射泛型属性类型

创建TestClass<int>实例时,您有一个具体的泛型类型 - 属性 int ,而不是 T

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

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

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

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

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

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

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