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

本文关键字:扩展 枚举 问题 const 自定义属性 | 更新日期: 2023-09-27 18:16:40

我使用本文为enum实现了Custom Attributes, hard 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的项目生成菜单,依赖于Culture我得到匹配的标题,也依赖于Config,我决定从菜单中显示/隐藏项目(事实上如果配置)。X == false,我不添加项目到菜单)

另外,对于配置,我有另一个系统,我想与菜单同步,这就是我想在运行时得到Config.X的原因。

谢谢!

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

没有办法解决这个问题,这是属性的限制。

你可以使用静态只读字段,如果你需要一个固定的对象集的行为:

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(对于c#新手)

您可以创建一个扩展方法

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

使用反射来访问Config对象上的相关属性。在你给出的例子中,如果myItem = Products那么你可以调用

myItem.GetConfigValue()

它应该返回Config的值。产品

相关问题:

    动态评价
  • 枚举名称

根据你的更新,我更建议这样做。属性在编译时必须是常量值(因此会出现错误)。即使您不采用扩展方法,您也绝对需要某种方法。