是否可以为属性提供变量文本?

时间:2014-10-28 10:34:20

标签: c# .net localization attributes

我有一个带有可选错误文本的属性,如下所示:

[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

这是不可能的,还是我错过了什么?

如何将文本参数本地化为属性?

1 个答案:

答案 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")]进行装饰。它的工作原理取决于特定属性和使用它们的代码。