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"
创建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 的答案)。