写代码的时候经常需要分析已有类型的信息
例如: 分析现有类型自动生成类, 或者为现有的类自动增加一些功能
总结了一点点经验
以 ClassA a; 为例
1. 通过 typeof(ClassA) 或者 a.GetType() 获取类型信息, 推荐使用 typef() 可以避免空引用, 而且有的时候不需要构造一个 ClassA 的实例,
typeof(ClassA) 的性能一点都不差, 不要把它和反射混为一谈,
2. 对于 Type.IsPrimitive 来说 很多常见的类型不是原生类型
例如 String DateTime decimal 都不是原生类型
按照 MSDN 的说明 原生类型只包括: http://msdn.microsoft.com/en-us/magazine/bb984984.aspx
3. 对于数组来说 , typeof(ClassA [])
可以使用 Type.IsArray 来判断是否数组
可以使用 Type.GetElementType 获取元素的类型 , 在这里等价于 typeof(ClassA)
数组实际上继承于 System.Array, 但是数组也实现 IEnumerable<T > 的接口 (这会让数组和 List<T > 等常见类型可以按照同样的方式处理)
3. 泛型来说 ,Typeof(List<ClassA>)
可以使用 Type.IsGenericType 来判断是否是泛型类型
可以使用 Type.GetGenericTypeDefinition() 来获取泛型类型 (开放类型) , 在这里等价于 typeof(List<>)
使用 Type.GetGenericArguments() 获取泛型参数集合 在这里, 集合中的第一个元素等价于 typeof(ClassA)
对于 Dictionary<string,ClassA> 这样的字典定义来说, Type.GetGenericArugment() 会返回两个类型, 分别是 typeof(string) 和 typeof(ClassA) 他的开放类型是 typeof(Dictionary<,>)
4. 可以调用 Type.GetInterfaces() 然后判断某个类型是否继承与某个接口
例如数组和 List<T > 都继承与 IEnumerable<T> 这样就可以用统一的方式处理
5. 可空值类型 例如 int? 本质上也是泛型 他的开放类型是 typeof(System.Nullable<>)
这里的开放类型指的是类型不完全, 需要增加参数 (一般是泛型参数) 才能构成一个真正的类型, 例如 List<> , 增加泛型参数 string 变为 List<string>
开放类型还不是一个完整的类型 不能直接构造出一个实例
封闭类型已经是一个完整的类型了 可以 new ..
来源: http://www.bubuko.com/infodetail-2898863.html