我使用this文章为Custom Attributes
实施enum
,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的项目中生成菜单,取决于{{1我得到匹配的标题,也取决于Culture
,我决定在菜单中显示/隐藏项目(事实上,如果Config.X == false,我不会将项目添加到菜单)
另外,对于Config,我有另一个系统,我想将该系统与菜单同步,这就是我想在运行时获得Config
的原因。
谢谢!
答案 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#)