背景
? C#是強類型語言,任何對象都有Type,有時候需要使用Type來進行反射、序列化、篩選等,獲取Type有Type.GetType, typeof(),object.GetType() 等方法,本文重點介紹Type.GetType()。
系統類型/本程序集內的類型
? 對于系統自帶的類型或本程序集內的類型,可以直接通過類型全名(FullName)來獲取,如下所示:
? Type.GetType("System.String") 。
引用的外部類型
? Type.GetType(FullName) 會返回null,需要使用Type 的 AssemblyQualifiedName,即包含類名和程序集信息的限定名,形如:
? Type.GetType(“System.String, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e”)。//用的是.net6
泛型類型
? 泛型類型應該分四步,
第一步:獲取不帶參數的泛型定義,即:
? var genericType = Type.GetType("System.Collections.Generic.Dictionary`2");
第二步:獲取參數的類型數組
? var args =?genericType.GetGenericArguments();//返回TKey,TValue
第三步:替換args里面的類型為具體類型
? var myArgs = new Type[] { Type.GetType("System.String"), Type.GetType("System.Int32") };
第四步:得到具體的泛型類
? var type = genericType.MakeGenericType(myArgs);
? 得到的type的AssemblyQualifiedName 非常的不友好(如下),不建議直接用Type.GetType(AssemblyQualifiedName)這種方式創建:
System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.Int32, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e。
用途
? Blazor動態控件DynamicComponent需要給定Type參數,我想讓這個參數由外部配置給出,這樣就可以把各種控件靈活的放到一個方塊里展示了。