C# 在Roslyn中获取方法调用的基类

C# 在Roslyn中获取方法调用的基类,c#,.net,roslyn,C#,.net,Roslyn,我可以在应用程序的每个类的方法中识别方法调用和调用。但是,如何获取调用或调用它们的类 例如,在以下代码中: var methodDeclarations = classitem.DescendantNodes().OfType<MethodDeclarationSyntax>(); foreach (var memmeth in methodDeclarations) { var varInvocations = memmeth.DescendantNodes().OfTy

我可以在应用程序的每个类的方法中识别方法调用和调用。但是,如何获取调用或调用它们的类

例如,在以下代码中:

var methodDeclarations = classitem.DescendantNodes().OfType<MethodDeclarationSyntax>();
foreach (var memmeth in methodDeclarations)
{

    var varInvocations = memmeth.DescendantNodes().OfType<InvocationExpressionSyntax>();
    foreach (InvocationExpressionSyntax invoc in varInvocations)
    {
        Console.WriteLine("---- Invocations---");
        Console.WriteLine(invoc.Expression);  // output: b1.ADD
        Console.WriteLine(invoc.Expression.Parent.GetText()); // output: b1.ADD(2)
    }
}
var methodDeclarations=classitem.DegenantNodes().OfType();
foreach(methodDeclarations中的var memmeth)
{
var varInvocations=memmeth.genderantnodes().OfType();
foreach(InvocationExpressionSyntax invoc在各种位置)
{
Console.WriteLine(“----调用----”;
Console.WriteLine(invoc.Expression);//输出:b1.ADD
Console.WriteLine(invoc.Expression.Parent.GetText());//输出:b1.ADD(2)
}
}

例如,我可以得到输出“b1.ADD”和“b1.ADD(2)”。我需要从中提取的是,ADD是在b1上调用的,b1是类B的一个实例。如何从上面代码中的调用中获得这个B类?换句话说,我需要告诉这个方法属于哪个类类型。我该怎么做呢?

您需要语义模型,它允许您从编译器访问类型信息(语法树只查看文件中的语法)


具体来说,您应该在
InvocationExpressionSyntax
上调用
GetSymbol()
,转换为
IMethodSymbol
,并查看它的各种属性。

谢谢大家!这是解决问题的办法;但不确定这是否是最佳解决方案和优雅的解决方案:

var model = compilation.GetSemanticModel(tree);
var methodDeclarations = classitem.DescendantNodes().OfType<MethodDeclarationSyntax>();
foreach (var memmeth in methodDeclarations)
{

    var varInvocations = memmeth.DescendantNodes().OfType<InvocationExpressionSyntax>();
    foreach (InvocationExpressionSyntax invoc in varInvocations)
    {
        Console.WriteLine("---- Invocations---");
        Console.WriteLine(invoc.Expression);  // output: b1.ADD
        Console.WriteLine(invoc.Expression.Parent.GetText()); // output: b1.ADD(2)
        var invokedSymbol = model.GetSymbolInfo(invoc).Symbol;
        Console.WriteLine(invokedSymbol.ToString()); //AppTest.B.ADD(int)
        Console.WriteLine(invokedSymbol.ContainingSymbol); //AppTest.B
        Console.WriteLine(invokedSymbol.ContainingSymbol.Name); //B  
    }
}
var model=compilation.GetSemanticModel(树);
var methodDeclarations=classitem.DegenantNodes(),of type();
foreach(methodDeclarations中的var memmeth)
{
var varInvocations=memmeth.genderantnodes().OfType();
foreach(InvocationExpressionSyntax invoc在各种位置)
{
Console.WriteLine(“----调用----”;
Console.WriteLine(invoc.Expression);//输出:b1.ADD
Console.WriteLine(invoc.Expression.Parent.GetText());//输出:b1.ADD(2)
var invokedSymbol=model.GetSymbolInfo(invoc.Symbol);
Console.WriteLine(invokedSymbol.ToString());//AppTest.B.ADD(int)
Console.WriteLine(invokedSymbol.ContainingSymbol);//AppTest.B
Console.WriteLine(invokedSymbol.ContainingSymbol.Name);//B
}
}

最后一行获取被调用方法的类名(作为字符串)并打印出来。

调用表达式语法税是否包含
MemberBindingExpressionSyntax
以及
MemberBindingExpressionSyntax
是否包含任何诊断(
membind.GetDiagnostics()
InvocationExpressionSyntax
上的
GetSymbol
将为您提供有关该方法的信息,包括其
包含类型
,但它不会告诉您
b1
的实际类型。要实现这一点,您需要在
b1
本身上调用
GetTypeInfo