从 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;
我定义了以下属性
[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;