【问题标题】:How to create an AttributeSyntax with a parameter如何使用参数创建 AttributeSyntax
【发布时间】:2016-03-10 21:14:34
【问题描述】:

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

[MyAttribute("some_param")]

现在我可以轻松创建AttributeSyntax,但不知道如何使用.AddArguments(ExpressionSyntax) 方法向ArgumentList 属性添加参数。我只是不确定我需要做什么来创建适当的表达式。

【问题讨论】:

标签: c# roslyn roslyn-code-analysis


【解决方案1】:

我是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")]

或者,您可以使用 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);

在您的示例中,您想添加 StringLiteralExpression 作为参数。

【讨论】:

    猜你喜欢
    • 2017-05-16
    • 2017-05-23
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多