http://www.cnblogs.com/yuanyuan/archive/2012/08/16/2642281.htmlhtml
寫代碼的時候常常須要分析已有類型的信息
例如:分析現有類型自動生成類, 或者爲現有的類自動增長一些功能
總結了一點點經驗
以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 ..數組