我正在尝试编写一个强类型的,可本地化的DisplayNameAttribute,但我甚至无法编译它。我想在viewmodel属性上做什么就像
[LocalizedDisplayName<HomeResources>(r => r.WelcomeMessage)]
基本上与
做同样的事情[DisplayName("Welcome to my site!")]
除了邮件已本地化。但是,我既不能使泛型构造函数工作(如何为构造函数提供类型参数?),也不能选择要使用的字符串。当前构造函数看起来像这样
public class LocalizedDisplayNameAttribute<TResource> : DisplayNameAttribute
{
public LocalizedDisplayName(Expression<Func<TResource, string>> resource)
{ // ...
但是编译器抱怨输入参数不是编译时常量,所以显然这种做法无效。
有没有办法获得显示名称的强类型本地化属性?那里有一个吗?
答案 0 :(得分:3)
您无法通过属性执行此操作。请记住,属性纯粹是嵌入在程序集中的元数据。目前无法将代码构造(如表达式)嵌入为元数据。
如果您真的想提供一种以强类型方式指定此元数据的方法,您可以编写自己的ModelMetadataProvider。这是一个非常高级的任务,但我目前正处于一篇博客文章的中间,该文章展示了如何写一篇我希望很快发布的文章。
答案 1 :(得分:0)
属性类不能是通用的。
答案 2 :(得分:0)
IMO,唯一可行的方法是:
[LocalizedDisplayName("WelcomeMessage")]
实际上框架属性没有输入(如DefaultPropertyAttribute等)
答案 3 :(得分:0)
由于属性不能是通用的,并且其参数必须是常量,因此您无法按照描述的方式执行此操作。无论如何,设计器生成的资源类的成员是静态的,因此您无法通过实例访问它们。
另一种选择是仅将资源名称传递给属性:
[DisplayNameResourceKey("WelcomeMessage")]
如果要检索实际消息,只需使用资源键调用ResourceManager.GetString
即可。但当然你失去了强大的打字......