.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? 有兴趣的朋友可以留言。