【问题标题】:Roslyn CodeFixProvider add attribute with argument having valueRoslyn CodeFixProvider 添加具有值的参数的属性
【发布时间】:2018-06-16 16:08:08
【问题描述】:

我正在为检测类声明中是否缺少MessagePackObject 属性的分析器创建一个 CodeFixProvider。此外,我的属性需要有一个参数keyAsPropertyName,其值为true

[MessagePackObject(keyAsPropertyName:true)]

我已经完成了添加不带参数的属性(我的解决方法)

private async Task<Solution> AddAttributeAsync(Document document, ClassDeclarationSyntax classDecl, CancellationToken cancellationToken)
{
    var root = await document.GetSyntaxRootAsync(cancellationToken);
    var attributes = classDecl.AttributeLists.Add(
        SyntaxFactory.AttributeList(SyntaxFactory.SingletonSeparatedList(
            SyntaxFactory.Attribute(SyntaxFactory.IdentifierName("MessagePackObject"))
        //                    .WithArgumentList(SyntaxFactory.AttributeArgumentList(SyntaxFactory.SingletonSeparatedList(SyntaxFactory.AttributeArgument(SyntaxFactory.("keyAsPropertyName")))))))
        //  .WithArgumentList(...)
        )).NormalizeWhitespace());

    return document.WithSyntaxRoot(
        root.ReplaceNode(
            classDecl,
            classDecl.WithAttributeLists(attributes)
        )).Project.Solution;
}

但我不知道如何添加具有价值的参数的属性。有人可以帮帮我吗?

【问题讨论】:

  • 你试过... .WithArgumentList(SyntaxFactory.AttributeArgumentList(SyntaxFactory.SingletonSeparatedList(SyntaxFactory.AttributeArgument(null, SyntaxFactory.NameColon("keyAsPropertyName"), SyntaxFactory.LiteralExpression(SyntaxKind.TrueLiteralExpression))))) 吗?
  • @GeorgeAlexandria,是的,效果很好。请回答,我会标记的。

标签: c# roslyn


【解决方案1】:

[MessagePackObject(keyAsPropertyName:true)] 是一个 AttributeArgumentSyntax,它有 NameColons 而没有 NameEquals,所以你只需要创建它作为 NameEquals 并传递正确的初始表达式,如下所示:

...
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());
...

【讨论】:

  • 如何调用AddAttributeAsync方法以及如何找到类
  • @KarthicG,建议您阅读教程,for example this
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-15
  • 1970-01-01
相关资源
最近更新 更多