我想从泛型类型名称中获取类型:
var myType = Type.GetType("MyProject.MyGenericType`1[[MyProject.MySimpleType, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]");
但它似乎不适用于那样的泛型......
这样做的好方法是什么?
答案 0 :(得分:3)
试试这个:
var myType = Type.GetType("MyProject.MyGenericType`1, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]");
然后使用MakeGenericType()
:
var finalType = myType.MakeGenericType(Type.GetType("MyProject.MySimpleType"));
或者,如果可以在编译类型中确定开放泛型类型,则只需将typeof
运算符与<>
一起使用:
var myType = typeof(MyProject.MyGenericType<>);
var finalType = myType.MakeGenericType(typeof(MyProject.MySimpleType));
请参阅MSDN
答案 1 :(得分:3)
最简单的方法是尝试&#34;逆向工程&#34;。
当你打电话时。
typeof(List<int>)
你得到了
System.Collections.Generic.List`1[System.Int32]
然后您可以将其用作模板,以便调用
Type.GetType("System.Collections.Generic.List`1[System.Int32]")
会给你正确的类型。
`之后的数字是通用参数的数量,然后使用逗号作为分隔符在[]
中列出。
编辑:如果您查看任何类型的FullName
,您将看到如何处理类型,同时还指定程序集。这将需要将类型包装在额外[]
中,因此最终结果将是
Type.GetType("System.Collections.Generic.List`1[[System.Int32, mscorlib]], mscorlib")
当然,如果需要,还可以指定版本,区域性和公钥令牌。
答案 2 :(得分:3)
如果您未指定程序集限定名称,Type.GetType
仅适用于mscorlib
类型。在您的示例中,您仅为嵌入式类型参数定义了AQN。
// this returns null:
var type = Type.GetType("MyProject.MyGenericType`1[[MyProject.MySimpleType, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]");
// but this works:
var type = Type.GetType("MyProject.MyGenericType`1[[MyProject.MySimpleType, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
如果您使用Assembly.GetType
代替Type.GetType
,您的原始类型字符串仍会有效:
var myAsm = typeof(MyGenericType<>).Assembly;
var type = myAsm.GetType("MyProject.MyGenericType`1[[MyProject.MySimpleType, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]");