强类型,可本地化的DisplayNameAttribute

时间:2010-07-27 07:17:19

标签: c# localization attributes data-annotations

我正在尝试编写一个强类型的,可本地化的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 个答案:

答案 0 :(得分:3)

您无法通过属性执行此操作。请记住,属性纯粹是嵌入在程序集中的元数据。目前无法将代码构造(如表达式)嵌入为元数据。

如果您真的想提供一种以强类型方式指定此元数据的方法,您可以编写自己的ModelMetadataProvider。这是一个非常高级的任务,但我目前正处于一篇博客文章的中间,该文章展示了如何写一篇我希望很快发布的文章。

答案 1 :(得分:0)

属性类不能是通用的。

答案 2 :(得分:0)

IMO,唯一可行的方法是:

[LocalizedDisplayName("WelcomeMessage")]

实际上框架属性没有输入(如DefaultPropertyAttribute等)

答案 3 :(得分:0)

由于属性不能是通用的,并且其参数必须是常量,因此您无法按照描述的方式执行此操作。无论如何,设计器生成的资源类的成员是静态的,因此您无法通过实例访问它们。

另一种选择是仅将资源名称传递给属性:

[DisplayNameResourceKey("WelcomeMessage")]

如果要检索实际消息,只需使用资源键调用ResourceManager.GetString即可。但当然你失去了强大的打字......