我有一个 ArgumentSyntax
在一些调用表达式中,如何得到对应的IParameterSymbol
在 IMethodSymbol
的调用?
自从我看到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/