我有一个带有可选错误文本的属性,如下所示:
[DoubleRangeCheck(2.0, 10.0, ErrorMessage="Text shown on error")]
现在我想本地化错误消息,所以我尝试了
[DoubleRangeCheck(2.0, 10.0, ErrorMessage=Properties.Resources.MsgLocalisedError)]
但是我收到编译错误,指出该属性必须是常量。
error CS0182: An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type
这是不可能的,还是我错过了什么?
如何将文本参数本地化为属性?
答案 0 :(得分:1)
属性,正如编译器所述,只能用常量值表示 - 它们基本上序列化并存储在元数据中。但是,通常可以通过对它们进行子类化来对它们进行子类化,并使子类覆盖为此目的而公开的某些虚拟方法。例如,使用[Category("Foo")]
,您可以执行以下操作:
class LocalizedCategoryAttribute : CategoryAttribute {
public LocalizedCategoryAttribute(string category) : base(category) { }
protected override string GetLocalizedString(string value)
{
// your code here! (treat "value" as the key)
return base.GetLocalizedString(value);
}
}
然后使用[LocalizedCategory("Foo")]
进行装饰。它的工作原理取决于特定属性和使用它们的代码。