如何使用参数创建AttributeSyntax

dev*_*ife 9 c# roslyn roslyn-code-analysis

我正在尝试使用Roslyn创建一个看起来像这样的参数:

[MyAttribute("some_param")]

现在我可以轻松创建AttributeSyntax但无法弄清楚如何ArgumentList使用该.AddArguments(ExpressionSyntax)方法向porperty 添加参数.我只是不确定我需要做什么才能创建合适的表达式.

Jos*_*rty 10

我是这些SyntaxFactory.Parse*方法的粉丝.(他们通常更容易理解)

您可以使用以下内容生成您正在寻找的属性:

var name = SyntaxFactory.ParseName("MyAttribute");
var arguments = SyntaxFactory.ParseAttributeArgumentList("(\"some_param\")");
var attribute = SyntaxFactory.Attribute(name, arguments); //MyAttribute("some_param")

var attributeList = new SeparatedSyntaxList<AttributeSyntax>();
attributeList = attributeList.Add(attribute);
var list = SyntaxFactory.AttributeList(attributeList);   //[MyAttribute("some_param")]
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用Kirill的RoslynQuoter工具手工制作的方法.但我认为没有人想要在没有他的工具的情况下编写代码的事实就是在说; ...)

手动方法如下:

var attributeArgument = SyntaxFactory.AttributeArgument(
    SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression, SyntaxFactory.Token(default(SyntaxTriviaList), SyntaxKind.StringLiteralToken, "some_param", "some_param", default(SyntaxTriviaList))));

var otherList = new SeparatedSyntaxList<AttributeArgumentSyntax>();
otherList = otherList.Add(attributeArgument);
var argumentList = SyntaxFactory.AttributeArgumentList(otherList);
var attribute2 = SyntaxFactory.Attribute(name, argumentList);
Run Code Online (Sandbox Code Playgroud)

在您的示例中,您要添加a StringLiteralExpression作为参数.