【问题标题】:Roslyn's GetTypeByMetadataName() and Generic TypesRoslyn 的 GetTypeByMetadataName() 和泛型类型
【发布时间】:2014-06-13 10:50:45
【问题描述】:

我正在尝试检索给定类型中的所有 IMethodSymbol。对于封闭类型(即没有泛型的类型),我可以使用 CSharpCompilation.GetTypeByMetaDataName() 并传入完全限定的类型名称。

但是,对于开放类型(例如MyClass<T>),完全限定名称似乎不起作用。我尝试提供不带类型参数 (MyClass) 和封闭类型 (MyClass<int>) 的完全限定名称,但似乎都不起作用。

使用完全限定名称查找此类型的最佳方法是什么?

【问题讨论】:

  • 我还以为是 MyClass`1。
  • 我怀疑泛型类型的标准命名模式适用:MyClass`1
  • 你们是对的,附加`1正确检索类型。

标签: c# types roslyn


【解决方案1】:

正如 cmets 中提到的,编译器约定是取一个像 MyClass<T> 这样的类名并将其表示为

MyClass`1

一个工作示例:

var tree = CSharpSyntaxTree.ParseText(@"
public class MyClass<T> {
    public static T Method()
    {
    }
}");

var mscorlib = new MetadataFileReference(typeof(object).Assembly.Location);
var compilation = CSharpCompilation.Create("MyCompilation",
       syntaxTrees: new[] { tree }, references: new[] { mscorlib });

var type = compilation.GetTypeByMetadataName("MyClass`1");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    相关资源
    最近更新 更多