gpt4 book ai didi

c# - 如何在 Roslyn 中获取调用的方法名称?

转载 作者:太空狗 更新时间:2023-10-29 18:07:20 25 4
gpt4 key购买 nike

我有这样的代码;

class abc{
void A()
{
//Some to do statements
}
void B()
{
var obj=A();
}
void C()
{
var call=B();
}
}

我想使用 roslyn 查找调用的方法名称。

像这里的 o/p 将是:

  • 对于方法B:调用方法A
  • 对于方法C:调用方法A

我想要这样的东西:

root.DescendantNodes().OfType<InvocationExpressionSyntax>().Where(md => md.Identifier.ValueText.Equals(methodName)).FirstOrDefault();

但 InvocationExpression 不包含要访问的标识符。如何获取标识符名称

最佳答案

我同意 SLaks 的观点,如果您想要的是:

“我想要方法调用语法节点,其中接收器语法——让我强调一下 SYNTAX——是等于某个特定字符串的单个标识符”

那么你想要的查询是这样的

var root = tree.GetRoot();
var nodes = from node in root.DescendantNodes()
.OfType<InvocationExpressionSyntax>()
let id = node.Expression as IdentifierNameSyntax
where id != null
where id.Identifier.ValueText == methodName
select node;

但我认为这可能不是您想要的。如果你想要的是“我想确切地知道调用了哪个方法,不管它是写成 A(...) 还是 Foo.Bar.A(...) 那么你根本不想考虑语法。你需要使用语义分析器来获取与调用相关联的符号,然后检查该符号是否标识您感兴趣的方法。

您主要对句法还是语义分析感兴趣? Roslyn 两者都做,但您只是在查看您提供的代码中的语法。

如果您正在寻找的是语义分析,那么您想做这样的事情:

var tree = CSharpSyntaxTree.ParseText(code);
var c = CSharpCompilation.Create("asm.dll");
c = c.AddSyntaxTrees(tree);
var model = c.GetSemanticModel(tree);
string methodName = "A";

var root = tree.GetRoot();
var symbols = from node in root.DescendantNodes()
.OfType<InvocationExpressionSyntax>()
let symbol = model.GetSymbolInfo(node.Expression).Symbol as IMethodSymbol
where symbol != null
where symbol.Name = methodName
select symbol;

关于c# - 如何在 Roslyn 中获取调用的方法名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29614112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com