首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DisplayAttribute -如何设置默认资源?

DisplayAttribute -如何设置默认资源?
EN

Stack Overflow用户
提问于 2013-06-06 17:01:58
回答 2查看 964关注 0票数 3

我有一个poco类产品

代码语言:javascript
复制
public class Product
{
    public int Id {get;set;}

    [RequiredEx]
    public string ProductName {get;set;}
}

RequiredEx属性只是RequiredAttribute (System.ComponentMode.DataAnnotations` )的一个小包装器,所以我不必每次都指定资源类型/名称。

代码语言:javascript
复制
public class RequiredExAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute
{
    public RequiredExAttribute()
    {
        this.ErrorMessageResourceType = typeof(ModelResources);
        this.ErrorMessageResourceName = "ErrorMessage.Required";
    }
}

现在,我想用Display属性来装饰我的属性

代码语言:javascript
复制
[Display(ResourceType=typeof(ModelResources), Name="Product.ProductName")]
public string ProductName { get; set; }

在这种情况下,我不能仅仅从DisplayAttribute继承,因为它是密封的。我有没有可能在每次使用这个属性时都不必输入ResourceType=typeof(ModelResources)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-06 17:32:12

由于该属性是sealed,并且不是更复杂的OO模型的一部分(基类只是Attribute,并且没有实现接口),所以我看不出您在这里有什么可用选项。基本上,我希望答案很简单:“每次都要注意指定ResourceType”。

票数 2
EN

Stack Overflow用户

发布于 2016-09-14 15:00:23

如果您只使用DisplayAttributeName属性,则可以通过继承(较旧的) DisplayNameAttribute来实现此目的,它不是密封的:

代码语言:javascript
复制
using System.Resources;

namespace System.ComponentModel
{
    public class LocalisedDisplayNameAttribute
        : DisplayNameAttribute
    {
        readonly ResourceManager m_resourceManager;
        readonly string          m_resourceName;

        public LocalisedDisplayNameAttribute(ResourceManager resourceManager,
                                             string          resourceName)
            : base()
        {
            m_resourceManager = resourceManager;
            m_resourceName    = resourceName;
        }

        public override string DisplayName
        {
            get { return m_resourceManager.GetString(m_resourceName); }
        }
    }
}

然后,您可以设置常用字符串资源的显示属性:

代码语言:javascript
复制
public class DisplayBizAttribute
    : LocalisedDisplayNameAttribute
{
    public DisplayBizAttribute(string resourceName)
        : base(StringsBiz.ResourceManager, resourceName)
    {
    }
}

public class DisplayWebAttribute
    : LocalisedDisplayNameAttribute
{
    public DisplayBizAttribute(string resourceName)
        : base(StringsWeb.ResourceManager, resourceName)
    {
    }
}

然后,您可以非常容易地本地化您的属性显示名称,使用字符串或常量:

代码语言:javascript
复制
[DisplayBiz("ProductName")]
public string ProductName { get; set; }

[DisplayBiz(StringNames.PHONE_NUMBER)]
public string ProductName { get; set; }

[DisplayWeb("EmailAddress")]
public string EmailAddress { get; set; }

更新

这可以通过在每个属性类中声明一个枚举,并更改构造函数或添加一个新的构造函数来改进:

代码语言:javascript
复制
public class DisplayBizAttribute
    : LocalisedDisplayNameAttribute
{
    public enum Name
    {
        PhoneNumber,
        ProductName,
    }

    public DisplayBizAttribute(Name resourceName)
        : base(StringsBiz.ResourceManager, resourceName.ToString())
    {
    }
}

现在,您不必使用硬编码字符串。

代码语言:javascript
复制
[DisplayBiz(DisplayBiz.Name.ProductName)]
public string ProductName { get; set; }

这是您经常做的事情,所以我想添加一个using来缩短枚举:

代码语言:javascript
复制
using Biz = System.ComponentModel.DisplayBiz.Name;
...
[DisplayBiz(Biz.PhoneNumber)]
public string PhoneNumber { get; set; }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16957873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档