访问 DiagnosticAnalyzer 中的属性参数

问题描述 投票:0回答:1

假设我有这样的属性

[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
public class MyAttribute: Attribute
{
     public MyAttribute(string name) {}
     public MyAttribute(int number) {}
}

[AttributeUsage(AttributeTargets.All)]
[My("whatever")]
[My(333)]
class XAttribute: Attribute {
}

[XAttribute]
public class Usage {}

请注意,

XAttribute
附加了多个
MyAttribute
实例。 如何在分析仪中获取 “whatever”333

这就是我尝试获取

MyAttribute
实例的方法:

private static void AnalyzeNode(SyntaxNodeAnalysisContext context)
{
    var node = context.Node;

    var attributes = node
        .DescendantNodes()
        .OfType<AttributeSyntax>()            
        ;

    foreach (var attribute in attributes)
    {
        // Get the symbol for the attribute
        var attributeSymbol = context.SemanticModel.GetSymbolInfo(attribute).Symbol as IMethodSymbol;
        if (attributeSymbol == null) continue;

        var myAttributeInstances = attributeSymbol
            .ContainingType
            .GetAttributes()
            .Where(a => a.AttributeClass?.Name == nameof(MyAttribute))
            .ToList();

        if (myAttributeInstances.Count == 0) continue;
        
        /// HERE
    }
}

我到达这里,列表中有正确数量的

AttributeData
实例。但我无法获取传递给它们的构造函数参数。
ConstructorArguments
属性为空。我对为属性传递的值有同样的问题,因为命名构造函数参数
NamedArguments
属性同样始终为空。

注意:属性是在与正在分析的程序集不同的程序集中定义的。

c# roslyn-code-analysis
1个回答
0
投票
foreach (var argument in attributeInstance.ConstructorArguments)
{
    if (argument.Kind == TypedConstantKind.Primitive)
    {
        // "whatever" and 333 will be here
        var value = argument.Value;
        // Do something with the value
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.