2016-03-10 4 views
4

Я пытаюсь использовать Рослин, чтобы создать параметр, который выглядит примерно так:Как создать AttributeSyntax с параметром

[MyAttribute("some_param")]

Теперь я могу легко создать AttributeSyntax, но не могу понять как добавить аргумент в формулу ArgumentList, используя метод .AddArguments(ExpressionSyntax). Я просто не уверен, что мне нужно сделать, чтобы создать соответствующее выражение.

+2

https://github.com/KirillOsenkov/RoslynQuoter/issues/9 – SLaks

ответ

5

Я являюсь поклонником методов 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")] 

В качестве альтернативы можно использовать ручную работу подход от инструмента 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 как ваш аргумент.

+0

Это сделало трюк! – devlife

Смежные вопросы