Можно ли присвоить атрибуту переменный текст?

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

Так это просто невозможно, или я чего-то не хватает?

Как я могу локализовать текстовый параметр для атрибута?

Теги:
attributes
localization

1 ответ

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, чтобы найти строку.
  • 0
    @MTR, как я уже сказал: все зависит от того, были ли разработаны [DoubleRangeCheck(...)] и / или код, который проверяет этот атрибут, с учетом локализации.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню