使用roslyn,如何在元数据引用中定义的类型上获取特定方法的符号?

时间:2019-11-16 10:43:34

标签: roslyn

我的解决方案在roslyn中可以正常运行,因此应解决所有类型

我能够像这样在元数据程序集中获得定义的类型:

string typeName = "MyCompany.MyLibrary.MyType`1";
var theType = compilation.GetTypeByMetadataName(typeName);

,当我查询成员名称时,我会在类型上看到该方法,并且想找到对该方法的所有引用,但是我无法弄清楚应该如何获得该方法的符号。当我尝试

var symbols = compilation.GetSymbolsWithName("MethodName");

它总是返回0。

我仍然看不到从我的文字导航到树中其下方的符号的方法。

由于没有元数据汇编的语法树,因此无法获取语义模型并以这种方式找到符号。

如果我在重写此方法时在当前解决方案中找到实现,则可以找到符号,但是我不想遍历,我想直接转到符号。

1 个答案:

答案 0 :(得分:0)

ITypeSymbol具有GetMembers,它以指定名称返回类型为ISymbol的所有成员(第二次重载)。因此,您只需要检查返回的成员集至少包含一个IMethodSymbol(或者,如果需要,您可以添加更具体的检查):

string typeName = "MyCompany.MyLibrary.MyType`1";
var theType = compilation.GetTypeByMetadataName(typeName);
if (!(theType is null))
{
    foreach (var member in theType.GetMembers("MethodName"))
    {
        if (member is IMethodSymbol method) //may check that method has a special parameters, for example
        {
            // you found the first "MethodName" method
        }
    }
}