使用自定义属性和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
的原因。
谢谢!
没有办法解决这个问题,这是属性的限制。
你可以使用静态只读字段,如果你需要一个固定的对象集的行为:
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的值。产品
相关问题:
- 动态评价
- 枚举名称
根据你的更新,我更建议这样做。属性在编译时必须是常量值(因此会出现错误)。即使您不采用扩展方法,您也绝对需要某种方法。