如何在没有ref或者在Roslyn中为方法创建一个命名参数?

时间:2012-10-05 16:53:15

标签: c# roslyn

在为构造函数创建命名参数时,我遇到了一个问题,即我可以使用的唯一构造函数要求refOrOutKeyword SyntaxToken。不允许传递null,而且Syntax.ParseToken("")失败。 Syntax.Token(SyntaxKind.RefKeyword)Syntax.Token(SyntaxKind.OutKeyword)都不合适,因为它们会插入refout

var ctorArgs = Syntax.ArgumentList();
var ctor = enclosingType.Members
                        .OfType<ConstructorDeclarationSyntax>()
                        .OrderBy(cc => cc.ParameterList.Parameters.Count)
                        .FirstOrDefault();
if (ctor != null)
{
    //
    // Summary:
    //     Creates a new ArgumentSyntax instance.
    // public static ArgumentSyntax Argument(
    //     NameColonSyntax nameColon,
    //     SyntaxToken refOrOutKeyword,
    // ExpressionSyntax expression);
    ctorArgs.AddArguments((
        from param in ctor.ParameterList.Parameters
        select Syntax.Argument(
                Syntax.NameColon(param.Identifier.ValueText),
                Syntax.ParseToken("") /* <- what to put here */, 
                Syntax.DefaultExpression(param.Type))
    ).ToArray());
}

我没有找到任何合适的文档来阐明我如何创建命名参数。

3 个答案:

答案 0 :(得分:3)

答案一直在我的鼻子底下,如果您想要“空”或空SyntaxToken,请使用default

Syntax.Argument(
    Syntax.NameColon(param.Identifier.ValueText),
    default(SyntaxToken),
    Syntax.DefaultExpression(param.Type))
// Produces output like:
//    baseUri: default(string)

答案 1 :(得分:3)

通常,看看在运行时表示的代码是如何帮助的。如果我解析使用命名参数的代码并查看相关RefOrOutKeyword.Kind的{​​{1}},那就是ArgumentSyntax。因此,您需要做同样的事情:创建一个None SyntaxToken作为其None

Kind

答案 2 :(得分:2)

您也可以分两步完成:

Syntax.Argument(Syntax.DefaultExpression(param.Type))
      .WithNameColon(Syntax.NameColor(param.Identifier.ValueText))