通常在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]
///
///
public class LocalizedCategoryAttribute : CategoryAttribute
{
public LocalizedCategoryAttribute()
: base()
{
}
public LocalizedCategoryAttribute(string category)
: base(category)
{
}
protected override string GetLocalizedString(string value)
{
return Resources.ResourceManager.GetString(value);
}
}
///
///
public class LocalizedDisplayNameAttribute : DisplayNameAttribute
{
public LocalizedDisplayNameAttribute()
: base()
{
}
public LocalizedDisplayNameAttribute(string displayName)
: base(displayName)
{
}
public override string DisplayName
{
get
{
return Resources.ResourceManager.GetString(base.DisplayNameValue);
}
}
}
///
///
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: C#/.NET