我可以在应用程序的每个类的方法中识别方法调用和调用。但是,我怎样才能知道他们被调用或调用哪个类?
在以下代码中,例如:
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)
}
}
例如,我可以得到输出“b1.ADD”和“b1.ADD(2)”。我需要从中提取的是在B1上调用ADD,它是B类的实例。如何从上面代码中的调用中获取此B类?换句话说,我需要告诉这个方法属于哪个类类型。我怎么能这样做?
答案 0 :(得分:1)
您需要语义模型,它允许您从编译器访问类型信息(语法树只查看文件中的语法)。
具体来说,您应该致电GetSymbol()
上的InvocationExpressionSyntax
,投放到IMethodSymbol
,并查看其各种属性。
答案 1 :(得分:0)
谢谢大家!这是完成工作的解决方案;不确定它是否是最好的解决方案和优雅的解决方案:
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
}
}
最后一行获取被调用方法的类名(作为String)并将其打印出来。