范型GenericType反射要点

  .Net提供了范型,有没有童鞋去看看Type这个类对范型有哪些特别的属性。当你反射时,如果判断该Type是范型,是怎样的范型。当你没弄明白,或者揣着糊涂当明白的时候,不妨仔细读读我的分析,对你理解范型有很大的好处。

 

    Type有这么几个属性是和范型有关的。IsGenericType,IsGenericTypeDefinition,IsGenericParameter,ContainsGenericParameters。

  • IsGenericType。很简单,如果是List<int>这样的,typeof(List<int>).IsGenericType就是true。
  • IsGenericTypeDefinition。是范型的定义,就是带T的那种,typeof(List<>).IsGenericTypeDefinition就是true,不过同时typeof(List<>).IsGenericType也是true。两者还有一个联系,typeof(List<int>).GetGenericTypeDefinition() = typeof(List<>)。
  • IsGenericParameter。就是当前Type是不是T。typeof(List<>).GetGenericArguments()[0].IsGenericParameter就是true。
  • ContainsGenericParameters。当前Type是否含有T类型的范型参数。typeof(List<>).ContainsGenericParameters就是true。

    好,似乎定义已经很清楚了,那么现在问题就来了。让我们来看看一个例子,看你能否做对。

 

 

        public class DoubleList<T> : List<List<T>>

        {

 

        }

Console.WriteLine(typeof(DoubleList<>).BaseType.GetGenericArguments()[0].IsGenericTypeDefinition);

 

    猜猜看会输出True还是False?

    让我分析一下,typeof(DoubleList<>).BaseType就是List<List<T>>,那么GetGenericArguments()[0]就是List<T>,那typeof(List<>).IsGenericTypeDefinition = true,所以答案是True?

 

     十分遗憾,我错了,答案是False.。前面的分析都对,但是List<T>不等于List<>,List<T>是一个带有GenericParameter的GenericType,而不是一个GenericTypeDefinition。typeof(DoubleList<>).BaseType.GetGenericArguments()[0].GetGenericTypeDefinition = typeof(List<>)。

 

 

     下一题,能否写一个方法,判断一个类是否继承或者实现了某个GenericTypeDefinition? 有兴趣的朋友可以留言。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值