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

标签 c# roslyn roslyn-code-analysis

我目前正在尝试查找 .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/

相关文章:

c# - Flash 和基于 Java/C# 服务器的应用程序之间的通信

c# - csc2.exe 退出,代码为 1

c# - Roslyn - 是接口(interface)的符号实现吗?

c# - 如何获取方法中使用的内部变量的名称

c# - HttpContext.RemapHandler 是否应该更改哪个处理程序处理请求?

c# - 我应该如何使用 C# 和 NUnit 对单元测试进行分组?

abstract-syntax-tree - 从 .Net 程序集获取 AST,无需源代码(IL 代码)

c# - 调用扩展方法时的隐式转换是不可能的

c# - 何时使用 SemanticModel.GetSymbolInfo 以及何时使用 SemanticModel.GetDeclaredSymbol

c# - ModelMetaData、Custom Class Attributes 和一个难以描述的问题