2014-10-28 118 views
1

我有一个可选的错误文本像这样的属性:是否可以给一个属性一个变量文本?

[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

属性,如编译器状态,只能用常数值表示 - 它们是,实质上是序列化并存储在元数据中。但是,通过对它们进行子分类并使子类覆盖某些为此目的而暴露的虚拟方法,通常可以对它们进行本地化。例如,对于[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")]装饰。它的工作效果取决于特定属性和消耗它们的代码。

+0

我认为这是正确的轨道。但是,我将如何做到这一点在自定义属性(我没有base.GetLocalizedString)?由于我的属性在不同的程序集中,我不知道如何获得正确的ResourceManager才能找到字符串。 – MTR 2014-10-28 11:03:28

+0

@MTR就像我说的:这一切都归结为'[DoubleRangeCheck(...)]'和/或*检查该属性的代码是否设计时考虑了本地化。 – 2014-10-28 11:14:29

相关问题