繁体   English   中英

CallerMemberName和枚举

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM