10

Roslyn を使用して、次のようなパラメーターを作成しようとしています。

[MyAttribute("some_param")]

これで簡単に作成できますが、メソッドを使用しAttributeSyntaxてプロパティに引数を追加する方法がわかりません。適切な表現を作成するために何をする必要があるのか​​ わかりません。ArgumentList.AddArguments(ExpressionSyntax)

4

1 に答える 1

16

私は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、引数として a を追加したいと考えています。

于 2016-03-10T22:07:54.190 に答える