c# - 如何创建带有参数的 AttributeSyntax

标签 c# roslyn roslyn-code-analysis

我正在尝试使用 Roslyn 创建一个如下所示的参数:

[MyAttribute("some_param")]

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

最佳答案

我是 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 作为您的参数。

关于c# - 如何创建带有参数的 AttributeSyntax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35927427/

相关文章:

c# - 正则表达式用 <br> 标签替换多个换行符

c# - 如何使用 FieldTypeDeclaration ( Roslyn ) 更改字段类型

c# - 将复选框列表绑定(bind)到数据模型中的字典

c# - 这足以签署数据吗?

c# - 如何知道 Roslyn 的 ScripEngine 中的输入是否仅部分完成

c# - 如何从 EdgeJS 应用程序引用 Roslyn 程序集?

c# - C# 中的闭包分配

c# - FindReferencesAsync 不返回跨项目的引用

c# - Roslyn Analyzer 分析命名空间

c# - 将 hashtable.Keys 转换为 List<int> 或其他 IEnumerable<int>