从这个回答:
https://stackoverflow.com/a/15738041/1250301
对这个问题:
How to get name of property which our attribute is set?
您可以使用CallerMemberName
来确定属性所附加的属性。这很酷。不幸的是,它似乎不适用于枚举。例如:
https://dotnetfiddle.net/B69FCx
public static void Main()
{
var mi = typeof(MyEnum).GetMember("Value1");
var attr = mi[0].GetCustomAttribute<FooAttribute>();
mi = typeof(Bar).GetMember("SomeProp");
attr = mi[0].GetCustomAttribute<FooAttribute>();
}
public class Bar
{
[Foo]
public string SomeProp { get; set; }
}
public class FooAttribute : Attribute
{
public FooAttribute([CallerMemberName]string propName = null)
{
Console.WriteLine("Propname = " + propName);
}
}
enum MyEnum
{
[Foo]
Value1,
[Foo]
Value2
};
当您为propName
访问它时, MyEnum
为空,但对于类Bar
,它按预期工作(即SomeProp
)。有没有办法让这个或类似的工作为枚举?或者我是否坚持向FooAttribute
添加属性并在将属性添加到枚举时设置它:
public class FooAttribute : Attribute
{
public MyEnum AttachedTo { get; set; }
}
enum MyEnum
{
[Foo(AttachedTo = MyEnum.Value1)]
Value1,
[Foo(AttachedTo = MyEnum.Value2)]
Value2
};
这很乏味,有可能容易出错。
答案 0 :(得分:0)
CallerMemberName
不适用于大会级别或const
成员。由于Enum值本质上是一个const,因此您无法获取该信息。如果您将[Foo]
应用于public const
上的class Bar
成员,您会看到相同的行为。
当我正在组织测试时,我内心的声音一直尖叫着我做错了什么。拥有const的属性似乎与装饰者的本质相反。我觉得你已经进入了未知世界,这里有怪物,&#39;领土。您可能想重新考虑您的设计并考虑不同的路径。