使用反射获取类型以提供给泛型类

时间:2012-02-23 04:13:04

标签: c# reflection

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

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 个答案:

答案 0 :(得分:3)

第1步 - 获取类型实例:

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

  

System.Collections.Generic.Dictionary`2 [[System.String,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089],[System.String,mscorlib,Version = 4.0.0.0,Culture =中性,PublicKeyToken = b77a5c561934e089]],mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089

很乱。我相信你可以删除其中的大部分但它仍然可以工作:

  

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

为此:

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

第2步(假设API强制使用IMO为shit的通用参数) - 使用反射动态地参数化通用方法:

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