2014-10-28 2 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

+0

@MTR как я говорю: все сводится к тому, что '[DoubleRangeCheck (...)]' и/или код, который * проверяет *, этот атрибут был разработан с учетом локализации. –