从不同dll中的字符串值表示中获取泛型类型

时间:2015-03-30 21:15:58

标签: c# generics reflection types

我有3种类型,来自不同的dll,你不能找到如何在字符串中存储泛型类型以及如何创建实例:

Type type1 = GetType1();
Type type2 = GetType2();
string strClassGenericType = "Namespace.ClassName<,>, DllName";

Type template = // How to get the generic template type?

Type genericType = template.MakeGenericType(new[] { type1, type2 });
object instance = Activator.CreateInstance(genericType);

我不确定this是否符合我的要求。

4 个答案:

答案 0 :(得分:2)

在您希望对象的类型没有已知类型参数的特定情况下,您可以使用带有类型参数数量的反引号。以下是Tuple的示例:

Console.WriteLine(typeof (Tuple<,>).FullName); //For information only, outputs "System.Tuple`2"
var typeName = "System.Tuple`2";
var type = Type.GetType(typeName);
var generic = type.MakeGenericType(typeof (string), typeof (int));
Console.WriteLine(generic.FullName); //Outputs the type with the type parameters.

答案 1 :(得分:1)

泛型类型的正确字符串表示形式如下:

"System.Collections.Generic.Dictionary`2[[System.String],[System.Object]]"

其中'2表示泛型类型参数的数量。

有关完全限定的类型名称,请参阅the fiddle


如果您正在寻找没有指定泛型类型参数的泛型类型(所谓的开放泛型),那就是:

"System.Collections.Generic.Dictionary`2, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"

答案 2 :(得分:1)

vcsjones abatishchev 都有正确答案,但您错过了dll。

感谢 vcsjones ,我使用了这个:

string strGenericType = "Namespace.ClassName`2, DllName";
Type template = Type.GetType(strGenericType);

Type genericType = template.MakeGenericType(new[] { type1, type2 });
object instance = Activator.CreateInstance(genericType);

感谢 abatishchev ,这更短:

string strGenericType = "Namespace.ClassName`2[[Namespace1.Type1, Type1DllName],[Namespace2.Type2, Type2DllName]], DllName";
Type genericType = Type.GetType(strGenericType);

object instance = Activator.CreateInstance(genericType);

答案 3 :(得分:0)

我认为你正在尝试从字符串值创建一个类型。

尝试:

Type type = Type.GetType("System.String");

例如,从字符串创建文本框类型:

Type.GetType("System.Windows.Forms.TextBox, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");

请参阅MSDN