从泛型类型fullname获取类型

时间:2016-09-15 08:02:45

标签: c# reflection

我想从泛型类型名称中获取类型:

var myType = Type.GetType("MyProject.MyGenericType`1[[MyProject.MySimpleType, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]");

但它似乎不适用于那样的泛型......

这样做的好方法是什么?

3 个答案:

答案 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]]");