CallerMemberName和枚举

时间:2015-01-22 16:38:01

标签: c# enums

从这个回答:

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
};

这很乏味,有可能容易出错。

1 个答案:

答案 0 :(得分:0)

CallerMemberName不适用于大会级别或const成员。由于Enum值本质上是一个const,因此您无法获取该信息。如果您将[Foo]应用于public const上的class Bar成员,您会看到相同的行为。

当我正在组织测试时,我内心的声音一直尖叫着我做错了什么。拥有const的属性似乎与装饰者的本质相反。我觉得你已经进入了未知世界,这里有怪物,&#39;领土。您可能想重新考虑您的设计并考虑不同的路径。