Сильно типизированный локализуемый DisplayNameAttribute - PullRequest
2 голосов
/ 27 июля 2010

Я пытаюсь написать строго типизированный локализуемый DisplayNameAttribute, но не могу его даже скомпилировать.То, что я хотел бы сделать с моими свойствами viewmodel, это что-то вроде

[LocalizedDisplayName<HomeResources>(r => r.WelcomeMessage)]

, что в основном делает то же самое, что и

[DisplayName("Welcome to my site!")]

, за исключением того, что сообщение локализовано.Однако я не могу заставить ни общий конструктор работать (как вы предоставляете аргументы типа конструктору?), Ни выбирать, какую строку использовать.Текущий конструктор выглядит следующим образом:

public class LocalizedDisplayNameAttribute<TResource> : DisplayNameAttribute
{
    public LocalizedDisplayName(Expression<Func<TResource, string>> resource)
    { // ...

, но компилятор жалуется, что входной аргумент не является константой времени компиляции, поэтому, очевидно, этот способ неверен.

Есть лиспособ получить строго типизированный, локализованный атрибут для отображаемого имени?Уже есть один?

Ответы [ 4 ]

3 голосов
/ 17 августа 2010

Вы не можете сделать это через атрибут.Помните, что атрибут - это чисто метаданные, встроенные в сборку.В настоящее время нет способа внедрить такую ​​конструкцию кода, как выражение, в качестве метаданных.

Если вы действительно хотите предоставить средства для указания этих метаданных строго типизированным способом, вы можете написать свой собственный ModelMetadataProvider.Это довольно сложная задача, но я сейчас нахожусь в середине поста в блоге, где показано, как написать тот, который я скоро опубликую.

0 голосов
/ 27 июля 2010

IMO, единственный способ сделать это:

[LocalizedDisplayName("WelcomeMessage")]

Фактически атрибуты фреймворка не набраны (например, DefaultPropertyAttribute и т. Д.)

0 голосов
/ 27 июля 2010

Поскольку атрибут не может быть универсальным, а его аргументы должны быть константами, вы не можете сделать это так, как описываете.В любом случае члены классов ресурсов, сгенерированных конструктором, являются статическими, поэтому вы не можете получить к ним доступ через экземпляр.

Другой вариант - передать атрибуту только имя ресурса:

[DisplayNameResourceKey("WelcomeMessage")]

Если вы хотите получить реальное сообщение, просто наберите ResourceManager.GetString с ключом ресурса.Но, конечно, вы теряете сильную типизацию ...

0 голосов
/ 27 июля 2010

Классы атрибутов не могут быть общими.

...