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# - 使用 Roslyn 有选择地删除预处理器指令

c# - 为什么我需要从 ConcurrentDictionary 转换为 IDictionary 才能使用 Add()?

C# 减去时间(小时分钟)

c# - "ArgumentException: Syntax node is not within Syntax tree"在 roslyn 中使用语义模型时

c# - Roslyn Analyzers是否支持x64构建配置?

c# - 使用 Roslyn 替换方法节点

c# - 如何使用 Roslyn 在给定的命名空间上下文中获得任意类型的最完全简化的类型名称?

c# - 我们可以从 Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax 获取 System.Type 吗?

c# - 如何进行多次拆分

c# - 在 C# cmdlet 中创建 PowerShell PSObject