C# Roslyn CodeFixProvider添加参数具有值的属性
我正在为正在检测类声明中是否缺少C# Roslyn CodeFixProvider添加参数具有值的属性,c#,roslyn,C#,Roslyn,我正在为正在检测类声明中是否缺少MessagePackObject属性的分析器创建CodeFixProvider。此外,我的属性需要有一个参数keyasprropertyname的值true [MessagePackObject(keyAsPropertyName:true)] 我已经添加了属性,没有像这样的参数(我的解决方案方法) 专用异步任务AddAttributeAsync(文档文档、ClassDeclarationSyntax classDecl、CancellationToken C
MessagePackObject
属性的分析器创建CodeFixProvider。此外,我的属性需要有一个参数keyasprropertyname
的值true
[MessagePackObject(keyAsPropertyName:true)]
我已经添加了属性,没有像这样的参数(我的解决方案方法)
专用异步任务AddAttributeAsync(文档文档、ClassDeclarationSyntax classDecl、CancellationToken CancellationToken)
{
var root=await document.GetSyntaxRootAsync(cancellationToken);
var attributes=classDecl.AttributeLists.Add(
SyntaxFactory.AttributeList(SyntaxFactory.SingletonSeparatedList(
属性(SyntaxFactory.IdentifierName(“MessagePackoObject”))
//.WithArgumentList(SyntaxFactory.AttributeArgumentList)(SyntaxFactory.SingletonSeparatedList(SyntaxFactory.AttributeArgument)(SyntaxFactory.(“keyAsPropertyName”(“keyAsPropertyName”))))())
//.WithArgumentList(…)
)).NormalizeWhitespace());
返回文档。WithSyntaxRoot(
root.ReplaceNode(
classDecl,
classDecl.WithAttributeList(属性)
)).项目解决方案;
}
但我不知道如何添加参数有值的属性。有人能帮我吗?[MessagePackObject(keyasprropertyname:true)]
是一个AttributeArgumentSyntax
,它有名称冒号,没有名称相等,所以您只需创建它,不传递任何名称相等,并传递正确的初始表达式,如下所示:
...
var attributeArgument = SyntaxFactory.AttributeArgument(
null, SyntaxFactory.NameColon("keyAsPropertyName"), SyntaxFactory.LiteralExpression(SyntaxKind.TrueLiteralExpression));
var attributes = classDecl.AttributeLists.Add(
SyntaxFactory.AttributeList(SyntaxFactory.SingletonSeparatedList(
SyntaxFactory.Attribute(SyntaxFactory.IdentifierName("MessagePackObject"))
.WithArgumentList(SyntaxFactory.AttributeArgumentList(SyntaxFactory.SingletonSeparatedList(attributeArgument)))
)).NormalizeWhitespace());
...
您是否尝试过
。使用ArgumentList(SyntaxFactory.AttributeArgumentList(SyntaxFactory.SingletonSeparatedList)(SyntaxFactory.AttributeArgument(null,SyntaxFactory.NameColon(“keyAsPropertyName”),SyntaxFactory.LiteralExpression(SyntaxKind.TrueLiteralExpression'))
?@GeorgeAlexandria,是的,它工作得非常出色。请回答,我会标记它。如何调用AddAttributeAsync方法以及如何查找class@KarthicG,建议您阅读教程,
...
var attributeArgument = SyntaxFactory.AttributeArgument(
null, SyntaxFactory.NameColon("keyAsPropertyName"), SyntaxFactory.LiteralExpression(SyntaxKind.TrueLiteralExpression));
var attributes = classDecl.AttributeLists.Add(
SyntaxFactory.AttributeList(SyntaxFactory.SingletonSeparatedList(
SyntaxFactory.Attribute(SyntaxFactory.IdentifierName("MessagePackObject"))
.WithArgumentList(SyntaxFactory.AttributeArgumentList(SyntaxFactory.SingletonSeparatedList(attributeArgument)))
)).NormalizeWhitespace());
...