首页 新闻 搜索 专区 学院

c#泛型反射问题

0
悬赏园豆:100 [已解决问题] 解决于 2020-07-10 14:52

示例代码

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 三个字母的,但这明显是一个笨方法

Amayer的主页 Amayer | 初学一级 | 园豆:120
提问于:2020-07-06 10:07
< >
分享
最佳答案
0
  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);
            }
        }
    }
收获园豆:100
小小高 | 小虾三级 |园豆:667 | 2020-07-08 15:58

感谢回答 但是目前还满足不了我想要的
现在我只有那个test对象,没有Test<,,>

Amayer | 园豆:120 (初学一级) | 2020-07-08 16:36

@Amayer: 

using System;

namespace ConsoleApp1
{
    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();

            foreach (var item in thisType.GetGenericTypeDefinition().GetProperties())
            {
                Console.WriteLine(item.PropertyType.Name);
            }
        }
    }
}
小小高 | 园豆:667 (小虾三级) | 2020-07-09 10:09
其他回答(5)
0

Type type = this.getClass().getGenericSuperclass();
ParameterizedType pt = (ParameterizedType)type;
Type argType = pt.getActualTypeArguments()[0];
entityClass = (Class<T>)argType;
this.entityName = entityClass.getName();

可以尝试一下

初夏的阳光丶 | 园豆:587 (小虾三级) | 2020-07-06 10:19

c# ...

支持(0) 反对(0) Amayer | 园豆:120 (初学一级) | 2020-07-06 11:04
-1

item.Name不就是属性的名称吗?

日暮青色 | 园豆:448 (菜鸟二级) | 2020-07-06 10:58
0

你为什么不能加个断点瞅瞅item里面是什么呢

彭小立 | 园豆:324 (菜鸟二级) | 2020-07-06 13:28
0

直接item.GetType().Name;就可以获取到了

helloworldworldhello | 园豆:118 (初学一级) | 2020-07-08 17:07
0

thisType.Assembly.GetType(typeName);

Amayer | 园豆:120 (初学一级) | 2020-07-10 14:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册