gpt4 book ai didi

c# Roslyn 从 ArgumentSyntax 中获取 IParameterSymbol

转载 作者:行者123 更新时间:2023-12-04 04:06:05 53 4
gpt4 key购买 nike

我有一个 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/

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