![](/img/trans.png)
[英]C# -> Roslyn -> Change ArgumentSyntax and VariableDeclaratorSyntax to InvocationExpression
[英]c# Roslyn get IParameterSymbol from ArgumentSyntax
我在某個調用表達式中有一個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
但這只有在同一解決方案中聲明方法時才有效。
我一直在嘗試自己找出相同的過程,在摸索了一下之后,我找到了一條前進的道路。 它需要訪問SemanticModel
。 就我而言,它來自 Roslyn 分析器的上下文。
SemanticModel.GetOperation(argumentSyntaxNode)
應該返回一個IArgumentOperation
,它有一個屬性IParameterSymbol Parameter
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.