c# Roslyn 从 ArgumentSyntax 中获取 IParameterSymbol

标签 c# roslyn roslyn-code-analysis

我有一个 ArgumentSyntax在一些调用表达式中,如何得到对应的IParameterSymbolIMethodSymbol的调用?
自从我看到ArgumentSyntax.NameColonSyntax ,这意味着参数可能有一些名称,我不能使用 IParameterSymbol.Ordinal通过它们在包含列表中的索引来匹配它们。

最佳答案

让我们来看看下面的代码片段:

public class Foo {
    public void Bar(int first, int second) {
        Add(first, second);
        Add(y: second, x: first);
    }
    
    public int Add(int x, int y) => x + y;
}
在这种情况下,Add方法被调用两次,第一次使用有序参数,第二次使用命名参数。
如果我们尝试使用索引获取参数,我们将无法获得第二次调用的正确结果。
解决此问题的一种方法(如果您事先知道名称)是尝试按名称获取参数并作为使用索引的备份:
private static ArgumentSyntax GetArgument(InvocationExpressionSyntax invocation, string name, int ordinal) =>
    GetArgument(invocation, name) ?? GetArgument(invocation, ordinal);

private static ArgumentSyntax GetArgument(InvocationExpressionSyntax invocation, string name) =>
    invocation.ArgumentList.Arguments
        .FirstOrDefault(argumentSyntax => argumentSyntax.NameColon?.Name.Identifier.Text == name);

private static ArgumentSyntax GetArgument(InvocationExpressionSyntax invocation, int ordinal) =>
    invocation.ArgumentList.Arguments[ordinal];
如果事先不知道参数名称,您可以获取方法符号:var methodSymbol = (IMethodSymbol) semanticModel.GetSymbolInfo(invocations[0].Expression).Symbol;查看声明语法引用:var methodDeclarationSyntax = methodSymbol.DeclaringSyntaxReferences.First().GetSyntax() as MethodDeclarationSyntax;并从声明中获取参数名称:methodDeclarationSyntax.ParameterList.Parameters[0].Identifier.Text但这只有在同一解决方案中声明方法时才有效。

关于c# Roslyn 从 ArgumentSyntax 中获取 IParameterSymbol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62506743/

相关文章:

c# - protobuf-net 序列化为字符串存入数据库然后反序列化

这个 C 哈希函数的 C# 等价物

c# - C#中多维数组的源码是如何生成的

c# - 为什么 VS 2017 建议用方法替换属性?

c# - 在 Roslyn 代码修复中有条件地添加 "using"语句

nuget - 使用新的csproj格式将文件放在nutkg中的 "analyzer"目录中

c# - "The description for Event ID X in Source Y cannot be found."

c# - MiniProfiler 没有出现在 asp.net MVC 上

c# - 转向资源重构

c# - 代码修复 : change members and class being used for a method call