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);方法

实例代码如下:
[csharp]
///

/// Override attribute for category
///

public class LocalizedCategoryAttribute : CategoryAttribute
{
public LocalizedCategoryAttribute()
: base()
{

}

public LocalizedCategoryAttribute(string category)
: base(category)
{

}

protected override string GetLocalizedString(string value)
{
return Resources.ResourceManager.GetString(value);
}
}

///

/// Override attribute for display name
///

public class LocalizedDisplayNameAttribute : DisplayNameAttribute
{
public LocalizedDisplayNameAttribute()
: base()
{

}

public LocalizedDisplayNameAttribute(string displayName)
: base(displayName)
{

}

public override string DisplayName
{
get
{
return Resources.ResourceManager.GetString(base.DisplayNameValue);
}
}
}

///

/// Override attribute display name
///

public class LocalizedDescriptionAttribute : DescriptionAttribute
{
public LocalizedDescriptionAttribute()
: base()
{

}

public LocalizedDescriptionAttribute(string description)
: base(description)
{

}

public override string Description
{
get
{
return Resources.ResourceManager.GetString(base.DescriptionValue);
}
}
}
[/csharp]

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

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

Tags:

Leave a Reply