假设我有这样的属性
[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
属性同样始终为空。
注意:属性是在与正在分析的程序集不同的程序集中定义的。
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
}
}