在为构造函数创建命名参数时,我遇到了一个问题,即我可以使用的唯一构造函数要求refOrOutKeyword
SyntaxToken
。不允许传递null
,而且Syntax.ParseToken("")
失败。 Syntax.Token(SyntaxKind.RefKeyword)
和Syntax.Token(SyntaxKind.OutKeyword)
都不合适,因为它们会插入ref
或out
:
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());
}
我没有找到任何合适的文档来阐明我如何创建命名参数。
答案 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))