我有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是否符合我的要求。
答案 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。