C#使用Attribute时的多语言化

通常在C#中我们用PropertyGrid来实验属性页功能,然后定义一个类,把对象实例传给PropertyGrid的SelectedObject属性。

然后在属性类中定义各个属性之前我们加各个Attribute调用来实现属性页上内容,如下代码:
[DisplayNameAttribute("XXX Name")]
[DescriptionAttribute("XXX Description")]
[CategoryAttribute("YYY")]
public string Name { get {...} set{...} }

现在需要实现多语言化,但在Attribute后的括号里不能使用Resources.XXX之类的内容来实现,因为那里需要常量。

解决办法是派生这些Attribute类,重载一些函数实现:

1. DisplayNameAttribute类我们重载public virtual string DisplayName { get; }属性

2. DescriptionAttribute类我们重载public virtual string Description { get; }属性

3. CategoryAttribute类我们重载protected virtual string GetLocalizedString(string value);方法

实例代码如下:

/// <summary>
/// Override attribute for category
/// </summary>
public class LocalizedCategoryAttribute : CategoryAttribute
{
    public LocalizedCategoryAttribute()
        : base()
    {
    }
    public LocalizedCategoryAttribute(string category)
        : base(category)
    {
    }
    protected override string GetLocalizedString(string value)
    {
        return Resources.ResourceManager.GetString(value);
    }
}
/// <summary>
/// Override attribute for display name
/// </summary>
public class LocalizedDisplayNameAttribute : DisplayNameAttribute
{
    public LocalizedDisplayNameAttribute()
        : base()
    {
    }
    public LocalizedDisplayNameAttribute(string displayName)
        : base(displayName)
    {
    }
    public override string DisplayName
    {
        get
        {
            return Resources.ResourceManager.GetString(base.DisplayNameValue);
        }
    }
}
/// <summary>
/// Override attribute display name
/// </summary>
public class LocalizedDescriptionAttribute : DescriptionAttribute
{
    public LocalizedDescriptionAttribute()
        : base()
    {
    }
    public LocalizedDescriptionAttribute(string description)
        : base(description)
    {
    }
    public override string Description
    {
        get
        {
            return Resources.ResourceManager.GetString(base.DescriptionValue);
        }
    }
}

最后用这些派生类替换属性类里各属性之前的Attribute类,然后把之前Attribute后括号里的内容移到Resources类里,定义一个名称,派生类使用这些名称代替而不是内容,比如:
[LocalizedDisplayNameAttribute("XXXName")]
[LocalizedDescriptionAttribute("XXXDescription")]
[LocalizedCategoryAttribute("YYY")]
public string Name { get {...} set{...} }

多语言Resouces里对应添加同样名称的字符串和内容,多语言实验参见C#多语言实施方法

Tags:

Leave a Reply


提醒: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。请务必注意user必须和评论者名相匹配(大小写一致)。