问题:
示例代码
public class Test<T,S,A>
{
public long Id { get; set; }
public T DoSomething { get; set; }
public S DoSomething2 { get; set; }
public A DoSomething3 { get; set; }
}
Test<long, string, DateTime> test = new Test<long, string, DateTime>();
var thisType = test.GetType();
foreach (var item in thisType.GetProperties())
{
Console.WriteLine(item);
}
在反射的时候,item 实际上是它们的实参(long,string,datetime), 我想获取T,S,A 这个三个泛型的类型怎么搞?(我要的是T,S,A 这三个字母)
更新
var typeName = test.GetType().FullName;
var typeView = thisType.Assembly.GetType(typeName);
foreach (var item in typeView.GetProperties())
{
Console.WriteLine(item);
}
通过程序集拿到这个泛型类 (typeName 输出的结果是
XXXX.Test`3[[System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]])
这种写法遍历拿到的依然是具体类型 从泛型的设计角度来说,泛型类里边的泛型就是个模板,此时的通过test对象貌似已经还原不到这个模板了
接下来我尝试下去掉typeName的具体类型
var typeView = thisType.Assembly.GetType("XXXX.Test`3");
foreach (var item in typeView.GetProperties())
{
Console.WriteLine(item);
}
这样是就够拿到T S A 三个字母的,但这明显是一个笨方法
回答1:
public class Test<T, S, A> { public long Id { get; set; } public T DoSomething { get; set; } public S DoSomething2 { get; set; } public A DoSomething3 { get; set; } } class Program { static void Main(string[] args) { //Test<long, string, DateTime> test = new Test<long, string, DateTime>(); //var thisType = test.GetType(); var thisType = typeof(Test<,,>); foreach (var item in thisType.GetProperties()) { Console.WriteLine(item.PropertyType.Name); } } }
回答2:
Type type = this.getClass().getGenericSuperclass();
ParameterizedType pt = (ParameterizedType)type;
Type argType = pt.getActualTypeArguments()[0];
entityClass = (Class<T>)argType;
this.entityName = entityClass.getName();
可以尝试一下
回答3:
item.Name不就是属性的名称吗?
回答4:
你为什么不能加个断点瞅瞅item里面是什么呢
回答5:
直接item.GetType().Name;就可以获取到了
回答6:
thisType.Assembly.GetType(typeName);