【发布时间】:2015-04-21 13:37:18
【问题描述】:
我需要按名称获取 C# 类型,其中接口应该与 typeof 几乎相同,除了字符串是在运行时命名的,而不是在编译时命名的类型 - 即 typeof(x) == runtime_typeof("x") 对于所有 @ 987654323@。相当关键的是,我还需要处理各种泛型情况,例如泛型定义和泛型类型。
我在 C# 中看到了其他一些按名称获取类型的解决方案,但它们似乎都涉及 CLR 错位名称而不是 C# 源名称。
此外,我需要检索给定 Type 对象的源名称,该对象应具有相同的形式。
如何通过 C# 源名称查找类型并从类型中检索 C# 源名称?
编辑:程序集限定名称和 C# 源名称不是一回事。因此问题的明确性。
我真正在寻找的是名称应该与您从 C# 源代码中引用它们时使用的名称相同 - 所以 IEnumerable<T> 或 IEnumerable<>,而不是 IEnumerable[1]` 或任何。要求完整的命名空间对我来说很好,而且我已经知道要查看哪些程序集,所以这主要是涉及泛型和名称修改时会发生什么的问题。
【问题讨论】:
-
Assembly.GetType或Type.GetType?顺便说一句,它看起来像 XY 问题。你想达到什么目的,也许有更好的解决方案? -
我不确定我是否理解您的要求。对此感到抱歉。但对于泛型类型,您需要使用反引号、泛型参数计数和 [类型名称]。例如
Type t = Type.GetType("System.Collections.Generic.List1[System.Int32]"); Type t2 = Type.GetType("System.Collections.Generic.Dictionary2[System.Int32,System.String]"); -
如果你举个例子,也许这个问题会更清楚? 源名称到底是什么?如果副本没有回答您的问题,我不清楚您的问题是什么。
-
@Liam:如果您只是从 C# 源代码中引用它,您将使用的名称。
-
按命名空间完全限定名称对我来说很好。但是限定名和程序集限定名是有区别的,尤其是在泛型方面。