Roslyn的GetTypeByMetadataName()和Generic Types

时间:2014-06-11 07:32:54

标签: c# types roslyn

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

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

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

1 个答案:

答案 0 :(得分:5)

正如评论中所提到的,编译器约定是采用类似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");