【问题标题】:Get type from generic type fullname从泛型类型全名获取类型
【发布时间】:2016-09-15 16:35:43
【问题描述】:

我想像这样从泛型类型全名中获取类型:

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

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

这样做的好方法是什么?

【问题讨论】:

  • 你的意思是关闭“

标签: c# reflection


【解决方案1】:

如果不指定程序集限定名称,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]]");

【讨论】:

  • 您的第一个解决方案似乎有效!但是如何使用泛型类型的 AQN 获取我的泛型类型的全名?
  • 看看我的回复。您可以像往常一样为泛型类型指定它,对于泛型参数,您可以将它们包装在 [] 中。
  • typeof(MyGenericType&lt;MySimpleType&gt;).AssemblyQualifiedName 返回 AQN
  • 完美,谢谢
【解决方案2】:

最简单的方法是尝试“逆向工程”。

当你打电话时。

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")

当然,如果需要,您还可以指定版本、文化和公钥令牌。

【讨论】:

  • 抱歉,复制/粘贴出错。我编辑了我的消息...这是我使用的方法,但它不适用于我的类型...
  • 您确定正确指定了类型名称吗?您可以使用Type.GetType() 分别获取这两种类型吗?
【解决方案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 运算符与&lt;&gt; 一起使用:

var myType = typeof(MyProject.MyGenericType<>);
var finalType = myType.MakeGenericType(typeof(MyProject.MySimpleType));

MSDN

【讨论】:

  • 我只有实现了泛型类型参数的泛型类型字符串:“MyProject.MyGenericType`1[[MyProject.MySimpleType, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null ]]"
  • @k4st0r42,我相应地修改了我的答案。但是,如果您只有 string,那么 @kiziu 解决方案可能会更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多