簡體   English   中英

c# Roslyn 從 ArgumentSyntax 獲取 IParameterSymbol

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM