У меня есть атрибут с необязательным текстом ошибки, например:
[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
Так это просто невозможно, или я чего-то не хватает?
Как я могу локализовать текстовый параметр для атрибута?
Атрибуты, как указано в компиляторе, могут быть выражены только в терминах постоянных значений - они по существу сериализованы и сохранены в метаданных. Тем не менее, часто их можно локализовать, подклассифицируя их, а подкласс переопределяет какой-либо виртуальный метод, открытый для этой цели. Например, с помощью [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")]
. Насколько хорошо это работает, зависит как от конкретного атрибута, так и от кода, который их использует.
[DoubleRangeCheck(...)]
и / или код, который проверяет этот атрибут, с учетом локализации.