从Roslyn

时间:2015-05-14 16:24:34

标签: c# roslyn

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

public void Foo(object firstParam, object secondParam, object thirdParam)

我希望能够说出以下调用的第二个参数

object bar = null;
this.Foo(null, bar, null)

预计名称为“secondParam”。基本上,我只想将一个参数与原始参数相关联,该参数在调用中占据“点”。

我在询问Roslyn中是否存在我不知道的任何util方法,因为有一些更复杂的方案需要处理,例如named或optionnal参数。我在此期间提出的解决方案应该涵盖一些情况,但可能不是全部(特别是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++;
            }
        }
    }

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

1 个答案:

答案 0 :(得分:2)

可悲的是,我认为没有一个良好的公共方式来做到这一点。请参阅Roslyn的内部DetermineParameter帮助程序,了解可能有用的内容。