C# 从INamedTypeSymbol.GetAttributes()获取属性对象,即AttributeData对象?
我已经定义了以下属性C# 从INamedTypeSymbol.GetAttributes()获取属性对象,即AttributeData对象?,c#,roslyn,C#,Roslyn,我已经定义了以下属性 [AttributeUsage(AttributeTargets.Class)] class DemoAttribute : Attribute { public string SomeInfo { get; } public DemoAttribute(string someInfo) { this.SomeInfo = someInfo; } } 可应用于某些类别,如下所示: [Demo("hello world")] class Progr
[AttributeUsage(AttributeTargets.Class)]
class DemoAttribute : Attribute
{
public string SomeInfo { get; }
public DemoAttribute(string someInfo)
{
this.SomeInfo = someInfo;
}
}
可应用于某些类别,如下所示:
[Demo("hello world")]
class Program { }
向我提供了一个INamedTypeSymbol
变量namedTypeSymbol
,该变量指向程序
类,我使用该类获取了属性的名称
foreach(var attr in namedTypeSymbol.GetAttributes())
{
if(attr.AttributeClass.Name == "DemoAttribute") { ... }
}
但是如何访问设置为
SomeInfo
有两种方法可以将参数传递给属性。通过设置属性([Demo(SomeInfo=“hello world”)]
)或通过构造函数,就像您正在做的那样。如果使用命名方法,Ponas将正确地认为解决方案位于NamedArguments
但是,在使用构造函数时,数据位于ConstructorArguments
中。这是一个TypedConstant
数组,从中可以获得值“hello world”
:
有两种方法可以将参数传递给属性。通过设置属性(
[Demo(SomeInfo=“hello world”)]
)或通过构造函数,就像您正在做的那样。如果使用命名方法,Ponas将正确地认为解决方案位于NamedArguments
但是,在使用构造函数时,数据位于ConstructorArguments
中。这是一个TypedConstant
数组,从中可以获得值“hello world”
:
我真的不知道这是否有帮助(没有时间检查),但请尝试查看attr.NamedArguments属性。@PonasJustas没有办法将Roslyn类型(如
AttributeData
)转换为反射类型(如Attribute
),这是正确的吗?@David correct。Roslyn和Reflection应该被视为两个不同的世界。有时它们具有类似的表示形式(如MetadataName
),但据我所知,实际对象不会在任何地方进行转换。我不知道这是否有帮助(没有时间检查),但请尝试查看attr.NamedArguments属性。@PonasJustas没有“转换”的方法是正确的吗从Roslyn类型(如AttributeData
)到反射类型(如Attribute
),David更正。Roslyn和Reflection应该被视为两个不同的世界。有时它们有一个类似的表示形式(如MetadataName
),但据我所知,实际对象不会在任何地方进行转换。
string attributeData = (string)attr.ConstructorArguments[0].Value;