【问题标题】:GetType When Type Is Provided As A String以字符串形式提供类型时的 GetType
【发布时间】:2014-03-20 23:16:31
【问题描述】:

我了解 C# 是一种静态类型语言,并且我已经阅读了此 SO 帖子的答案: initialize a class by string variable in c#?

不过,我的问题有点不同。我正在使用一个 T4 模板,该模板为我提供了一个类的名称作为字符串参数。我会在这里给出模板代码,但重要的是类型是字符串,所以它与在任何 C# 模块中使用此语句相同:

string s = "MyNamespace.Customer.Model";

使用该字符串,我需要将类型转换为类型变量。通常,当我可以访问实际类型时,我会使用此代码:

Type typeModel = typeof(MyNamespace.Customer.Model);

如果给定一个字符串,我将如何获得类型?换句话说,我的代码理想情况下看起来像这样(我知道这不起作用,因为“s”是一个字符串):

Type typeModel = typeof(s);

(顺便说一句,我确实知道该类型在哪个程序集中,因此我可以使用该信息;此外,模板引用了包含相关类型的程序集,这值得...)

注意:我不想创建 Type 的对象实例,因此请不要建议需要使用 Activator.CreateInstance 的解决方案,除非这是唯一的解决方案...

感谢您提供的任何想法。

【问题讨论】:

  • 是否预先知道可能的类型范围?
  • 不,很遗憾。这是将进入 Microsoft 提供的 MVC 脚手架模板之一的代码。这个想法是你可以在你的项目中搭建任何模型——所以,不,我不知道可以呈现哪些模型类型。

标签: reflection gettype


【解决方案1】:

Type.GetType(string typeName) 方法做你想做的事,但如果你只提供类型的FullName(命名空间和名称),它只会解析来自当前程序集或 mscorlib 的类型。

如果要解析当前程序集之外的类型,则需要提供 AssemblyQualifiedName。问题当然是多个程序集可以包含具有相同名称和命名空间的不同类型(感谢 Steven Liekens):

string aqn = Assembly.CreateQualifiedName(assemblyName, namespaceAndNameOfType);
Type t = Type.GetType(aqn);

如果您事先不知道程序集,您可以通过以下方式处理:

然后遍历每个程序集的GetTypes() 方法。

【讨论】:

  • 看起来您可以使用静态Assembly.CreateQualifiedName() 来改进您的答案。
  • @StevenLiekens 我不知道有这种方法,谢谢!
  • 我明天要试试 Assembly.CreateQualifiedName(),我会告诉你我发现了什么。
  • Assembly.CreateQualifiedName 函数对我不起作用。它返回一个 aqn,但是当我执行 Type.GetType(aqn) 时出现此错误:“给定的程序集名称或代码库无效。”进一步阅读后,CreateQualifiedName 采用两个参数,程序集名称和类型名称(作为字符串)。程序集名称应该是“FullTypeName”。这使我进入了 AssemblyName 类。我尝试传递从 .Net Reflector 获得的 FullTypeName,但我收到了相同的错误消息。无论如何,我无法从传入的内容中直觉出完整的类型名称,所以我需要一个不同的解决方案......
  • 最后,你至少需要提供"Namespace.Typename, AssemblyName"。如果程序集已签名,则需要包含其他信息来解析程序集。
猜你喜欢
  • 2023-01-30
  • 2021-09-26
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
相关资源
最近更新 更多