使用自定义属性扩展枚举和const值问题

时间:2015-10-06 20:06:25

标签: c# enums custom-attributes

我使用this文章为Custom Attributes实施enumhard coding值一切正常,但我需要传递run time中的参数,例如:

enum MyItems{
    [CustomEnumAttribute("Products", "en-US", Config.Products)]
    Products
}

Config.Products (bool value)是问题,错误是:

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type

有什么方法可以解决这个问题吗?

更新

enum(本例中为MyItems)有20个项目,每个项目都必须有custom attribute,然后我想从Enum的项目中生成菜单,取决于{{1我得到匹配的标题,也取决于Culture,我决定在菜单中显示/隐藏项目(事实上,如果Config.X == false,我不会将项目添加到菜单)

另外,对于Config,我有另一个系统,我想将该系统与菜单同步,这就是我想在运行时获得Config的原因。

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以创建扩展方法

public string GetConfigValue(this MyItems myItem)
{
    return Config.GetType().GetProperty(myItem.ToString()).GetValue(Config, null);
}

这使用反射来访问Config对象上的相关属性。在您提供的示例中,如果myItem = Products,则可以调用

myItem.GetConfigValue()

它应该返回Config.Products的值

相关SO问题:

根据您的更新,我会更多地建议这一点。属性在编译时必须是常量值(因此您得到的错误)。即使你不去扩展方法路线,你也绝对需要某种方法。

答案 1 :(得分:0)

无法解决这个问题,这是属性的限制。

如果您需要一组具有行为的固定对象,则可以使用静态只读字段:

public class MyItems
{
    public string Name { get; private set; }

    public string Locale { get; private set; }

    readonly Func<OtherThing> factory;

    public static readonly MyItems Products = new MyItems("Products", "en-US", () => Config.Products);
    public static readonly MyItems Food = new MyItems("Food", "en-GB", () => Config.FishAndChips);

    private MyItems(string name, string locale, Func<OtherThing> factory)
    {
        this.Name = name;
        this.Locale = locale;
        this.factory = factory;
    }

    public OtherThing GetOtherThing() {
        return factory();
    }
}

有关更完整示例,请参阅另一个答案: C# vs Java Enum (for those new to C#)