gpt4 book ai didi

c# - 如何使用 Roslyn 查找调用方法的参数是变量(通过 "var/string")还是内联字符串

转载 作者:行者123 更新时间:2023-12-05 02:12:03 24 4
gpt4 key购买 nike

我目前正在尝试查找 .ExecuteSqlCommand 的调用并检查传递给 sql 参数的第一个值。

这是我在我们的代码库中发现的差异示例。

ExecuteSqlCommand("[sql statement here]");

对比

var sql = "sql statement";
ExecuteSqlCommand(sql);

到目前为止,我有这个:

var invocations = root.DescendantNodes()
.OfType<InvocationExpressionSyntax>()
.Select(ie => ModelExtensions.GetSymbolInfo(model, ie).Symbol)
.Where(symbol => symbol != null && symbol.Name == "ExecuteSqlCommand");

foreach (var invocation in invocations)
{
var method = (IMethodSymbol)invocation;
foreach (var param in method.Parameters)
{
//I can't quite seem to get information from IParameterSymbol about whether the param is a string literal, or a reference to a string via a variable.
}
}

如果参数不是字符串,而是 var,那么我需要获取 var 的值(尽可能多地在运行时定义)。

我不太确定这是 SemanticModel 还是 SyntaxTree 的工作,但我的猜测是 SemanticModel 应该有我需要的更丰富的信息,让我发现我正在寻找的东西。

我的总体目标是查询传递给 ExecuteSqlCommand 方法的 sql。

谢谢!

最佳答案

SemanticModel.GetConstantValue是我们处理这种情况的 API。

它可以同时接受 syntax node和一个 expression .您仍然需要跟踪变量的状态回到它们的声明位置,并确定它们是否被赋予常量表达式。

我会使用 SemanticModel.GetSymbolInfo 。象征?。 DeclaringSyntaxReferences .First() 查找变量的声明位置,然后检查它是否为常量表达式。

关于c# - 如何使用 Roslyn 查找调用方法的参数是变量(通过 "var/string")还是内联字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56531074/

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