从 INamedTypeSymbol.GetAttributes() 获取属性对象,即 AttributeData 对象?

Get Attribute object from INamedTypeSymbol.GetAttributes() i.e. AttributeData object?

我定义了以下属性

[AttributeUsage(AttributeTargets.Class)]
class DemoAttribute : Attribute
{
  public string SomeInfo { get; }

  public DemoAttribute(string someInfo)
  {
    this.SomeInfo = someInfo;
  }
}

可以应用于某些 class,如下所示:

[Demo("hello world")]
class Program { }

一个指向 Program class 的 INamedTypeSymbol 变量 namedTypeSymbol 被提供给我,我用它获得了属性的名称。

foreach(var attr in namedTypeSymbol.GetAttributes())
{
  if(attr.AttributeClass.Name == "DemoAttribute") { ... }
}

但是如何访问设置为 SomeInfo 的内容?

您可以通过两种方式将参数传递给属性。通过设置 属性 ([Demo(SomeInfo="hello world")]) 或通过构造函数,就像你正在做的那样。如果您使用命名方法,Ponas 认为解决方案位于 NamedArguments 中是正确的。

但是,由于您正在使用构造函数,因此数据位于 ConstructorArguments 中。这是一个TypedConstant的数组,从中可以得到值"hello world":

string attributeData = (string)attr.ConstructorArguments[0].Value;