c#泛型反射问题

2020-07-10 14:34发布

问题:


示例代码

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);