C# 从Roslyn中方法调用中的相应参数获取方法参数的名称

C# 从Roslyn中方法调用中的相应参数获取方法参数的名称,c#,roslyn,C#,Roslyn,我想知道,通过查看特定方法/构造函数的调用,是否存在一些现有逻辑来获取其包含方法/构造函数签名中参数定义的名称(或任何其他相关信息)。基本上,我只希望能够获得一个变量的默认名称,该变量将作为参数传递给调用。因此,如果一种方法被定义为: public void Foo(object firstParam, object secondParam, object thirdParam) 我想说,下面调用的第二个参数 object bar = null; this.Foo(null, bar, nul

我想知道,通过查看特定方法/构造函数的调用,是否存在一些现有逻辑来获取其包含方法/构造函数签名中参数定义的名称(或任何其他相关信息)。基本上,我只希望能够获得一个变量的默认名称,该变量将作为参数传递给调用。因此,如果一种方法被定义为:

public void Foo(object firstParam, object secondParam, object thirdParam)
我想说,下面调用的第二个参数

object bar = null;
this.Foo(null, bar, null)
应具有名称“secondParam”。基本上,我只想将一个参数与它在调用中占据“位置”的原始参数关联起来

我在问Roslyn中是否已经存在我不知道的任何util方法,因为还有一些更复杂的场景需要处理,例如命名参数或可选参数。同时,我提出的解决方案应该涵盖一些情况,但可能不是全部(尤其是params,它需要一些更专门的逻辑来处理)。以下是我目前掌握的情况:

    private IEnumerable<IdentifierNameSyntax> GetParameterNamesFromArgumentList(ArgumentListSyntax argumentList, SyntaxNodeAnalysisContext context)
    {
        var arguments = argumentList.Arguments;
        var parameters = argumentList.Parent.GetSymbolOrDeclaredAs<IMethodSymbol>(context)?.Parameters;

        if (parameters != null)
        {
            var index = 0;
            foreach (var parameter in parameters)
            {
                var argument = index < arguments.Count ? arguments[index] : null;

                if (argument != null && argument.NameColon == null)
                {
                    yield return SyntaxFactory.IdentifierName(parameter.Name);
                }
                else if (argument != null)
                {
                    yield return argument.NameColon.Name;
                }

                index++;
            }
        }
    }
private IEnumerable GetParameterNamesFromArgumentList(ArgumentListSyntax argumentList,SyntaxNodeAnalysisContext上下文)
{
var arguments=argumentList.arguments;
var参数=argumentList.Parent.GetSymbolOrDeclaredAs(上下文)?.parameters;
if(参数!=null)
{
var指数=0;
foreach(参数中的var参数)
{
var argument=index

我可以在方法符号上使用
DeclaringSyntaxReferences
,但我认为只要使用
iparetersymbol
中的名称就足以满足我的需要。同样,如果这种逻辑已经在其他地方实现,我宁愿使用它。如果没有,那么,请随时告诉我您对这个问题的看法。

遗憾的是,我认为没有一个好的公开方法可以做到这一点。请向Roslyn的内部助手咨询一些可能有用的信息。

谢谢Kevin。这似乎与我采取的方法非常相似,但至少这证实了我走的是正确的道路。哦,在类中找到所有这些非常有用的方法的痛苦,在引用源代码中,它们的名字前面有一个危险的“内部”方法……是的。我想在参考源代码中解决的一件事是子字符串搜索,这样至少搜索
参数
时会包含该方法。