[英]CallerMemberName and enums
从这个答案:
https://stackoverflow.com/a/15738041/1250301
对于这个问题:
您也可以使用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
};
当您为MyEnum
访问它时, propName
为null,但对于Bar
类,它按预期工作(即SomeProp
)。 有没有办法让枚举做到这一点或类似的工作? 或者我坚持将属性添加到FooAttribute
并在将属性添加到枚举时FooAttribute
进行设置:
public class FooAttribute : Attribute
{
public MyEnum AttachedTo { get; set; }
}
enum MyEnum
{
[Foo(AttachedTo = MyEnum.Value1)]
Value1,
[Foo(AttachedTo = MyEnum.Value2)]
Value2
};
这很乏味,并且可能容易出错。
CallerMemberName
不适用于程序集级别或const
成员。 由于Enum值本质上是const,因此您无法获取该信息。 如果将[Foo]
应用于class Bar
上的public const
成员,您将看到相同的行为。
当我进行测试时,我内心的声音一直在尖叫我做错了什么。 通常,在const上具有属性似乎与装饰器的性质相反。 我觉得您正在进入一个未知的领域,“这里有怪物”。 您可能需要重新考虑您的设计并考虑不同的路径。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.