背景
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参数,我想让这个参数由外部配置给出,这样就可以把各种控件灵活的放到一个方块里展示了。