C#中类型分析中的常见问题 Type
2016-04-01 12:23
459 查看
原文地址:C#中类型分析中的常见问题 Type
写代码的时候经常需要分析已有类型的信息
例如:分析现有类型自动生成类, 或者为现有的类自动增加一些功能
总结了一点点经验
以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 ..
写代码的时候经常需要分析已有类型的信息
例如:分析现有类型自动生成类, 或者为现有的类自动增加一些功能
总结了一点点经验
以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 ..
相关文章推荐
- C# --数组
- C# 特性详解
- C#winform如何最小化主窗口
- C# 元数据描述
- 如何在C#项目中引用dll文件
- C# 工具栏
- C#(WPF和WinForm)在普通类中调用到主线程的方法,SynchronizationContext的用法。
- C#之RabbitMQ系列(一)
- C# 对List<T>取交集、连集及差集
- C# UrlDecode将+替换为空格问题
- 利用C#自带组件强壮程序日志
- 2016-4-1--C#可空类型&&"??"运算符
- C#第一篇之性能优化
- c#软件开发原则
- C#基本功------委托和事件(三)
- C#特性
- C# DllImport“调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配 ”
- C#:办公用品管理软件项目总结
- [C#]UDP通讯
- C# WinForm开发系列 - DataGridView 使用方法集锦