c#:泛型反射

1. 泛型类是类的模板(运行时一般需要具化才能使用)

泛型类是类的模板,它不能被当做正常类来使用,比如说:不能创建实例。
如下:

 public class Person<T>
 {
     public string Name { get; set; }
 }

这个Person<T>是类的模板,它都不是正常的类,所以,不能创建实例,看下面:
在这里插入图片描述
比较迷惑的是:在写代码的时候也不区分它是不是泛型类啊,比如:
在这里插入图片描述
这个NewInst<T>方法也没有报过错啊。

其实,NewInst<T>方法之所以不报错,是因为在程序运行调用的时候,那个T就已经确定了,回想下,之前调用的代码是不是这样的:
在这里插入图片描述

就是说无论方法嵌套了几层,最终执行的时候T肯定是已经确定了。

再看问题: Person<Fu>Person<Zi>它们之间有继承或实现关系吗?可以将 Person<Fu>
赋值给 Person<Zi>吗?

首先,Person<Fu>Person<Zi>它们没有继承或实现关系,它们除了是从一个泛型模板具化来的,没有其他联系。
另外,一般情况下不能将Person<Fu>赋值给或接受自Person<Zi>的变量,但我们运用逆变和协变的时候或许可以,参照:《c#: 协变和逆变深度解析》

因为Person<Fu>Person<Zi>不是同一个类,它们拥有不同的Type实例,所以下面的用法会导致意想不到的效果:
在这里插入图片描述

2. 泛型方法是方法的模板(运行时一般需要具化才能使用)

和泛型类一样,泛型方法也不能直接使用,如:
在这里插入图片描述
如果想运行,比如将T具化才行,如下:
在这里插入图片描述
同泛型类一样,无论我们的方法嵌套几层,运行到这个方法的时候,肯定是已经具化了的。

3. 泛型类的特别应用场景

泛型类是模板类,它不能当做正常类实例化调用,但是它在写框架的时候非常有用,比如:

在asp.net core中注入时:
在这里插入图片描述

4. 如何反射和具化一个泛型类、泛型方法

public class Class2
{
    public static void Main()
    {
        //反射泛型类
        var type = typeof(Person<>);
        Console.WriteLine($"type.IsGenericType={type.IsGenericType}");
        Console.WriteLine($"type.Name={type.Name}");
        //泛型类的具化
        var type2 = type.MakeGenericType(typeof(int));
        var personInt = Activator.CreateInstance(type2);

        //反射泛型方法
        var method = typeof(Class2).GetMethod("Test", new[] { typeof(IEnumerable<>).MakeGenericType(Type.MakeGenericMethodParameter(0)), Type.MakeGenericMethodParameter(0) });
        Console.WriteLine($"method.IsGenericType={method.IsGenericMethod}");
        Console.WriteLine($"method.Name={method.Name}");
        //泛型方法的具化
        var method2 = method.MakeGenericMethod(typeof(int));
        method2.Invoke(null, new object[] { new List<int>(), 1 });

        Console.ReadLine();
    }
    public static void Test<T>(IEnumerable<T> list, T t) => Console.WriteLine($"t={t},list.Count={list.Count()}");
    public static void Test<T>() => Console.WriteLine("ok");
}

public class Person<T> { }

运行效果:
在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jackletter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值