C#反射通用属性类型

时间:2016-02-02 08:44:46

标签: c# reflection properties

说我有这样的课程:

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"

2 个答案:

答案 0 :(得分:5)

当您创建<a data-featherlight={ `string${this.props.data.imageUrl}` }> 实例时,您有一个具体的通用类型 - 属性 select pc.categoryName, pc.Short_Desc, CAST(pc.categoryImage as Varbinary), COUNT(p.categoryCodeId)as Total from tbl_product as p, tbl_productCategory as pc where p.categoryCodeId=pc.categoryCodeId group by p.categoryCodeId, pc.categoryName,pc.Short_Desc, CAST(pc.categoryImage as Varbinary) order by pc.categoryName ,而不是TestClass<int>

要获得实际的通用类型,您可以使用int

T

如果您想区分实际类型和泛型类型参数,可以使用GetGenericTypeDefinition

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

答案 1 :(得分:3)

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

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

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