使用反射获取类型以馈送到泛型类



如何使用类名字符串获取类名/类型?像

Dictionary<string, string> DFields = GetFields();

类型是

Dictionary<string, string>
object = Deserialize<?>(_stream)

理想情况下,我在想:

object = Deserialize<"Dictionary<string, string>">(_stream)

它应该成为

object = Deserialize<Dictionary<string, string>>(_stream) 

为了工作。我像10对象一样序列化,但我只有字符串格式的类型名。我需要将字符串格式格式化为实际类型,以便将其提供给通用序列化器反序列化器函数。

步骤1-获取类型实例:

您需要使用传递到Type.GetType()中的程序集限定名称。通过在Dictionary()类型的实例上调用GetType().AssemblyQualifiedName进行快速测试,结果是:

System.Collections.Generic.DDictionary `2[[System.String,mscorlib,Version=4.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089],[SystemString,mscolleib,Version=4.0.0.0,Culture=neural,PublicKeyToken=b 77a5c561534e089]],mscorllib,Version=40.0.0,Culture=neutral

真是一团糟。我相信你可以删除大部分,但它仍然有效:

System.Collections.Generic.Dictionary `2[[System.String,mscorlib],[System.String,mscorlib]],mscorlb

因此:

var typeName = "System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.String, mscorlib]], mscorlib";
var type = Type.GetType( typeName );

步骤2(假设API强制使用一个通用参数,IMO是垃圾)-使用反射动态参数化通用方法:

var genericMethod = typeof(Serialzier).GetMethod( "Deserializer" );
var parametizedMethod = genericMethod.MakeGenericMethod( type );
var parameters = new object[] { _stream };
var deserializedInstance = parametizedMethod.Invoke( null, parameters );

最新更新