基本的思路是编写一个语言对应配置信息文件,然后使用反射动态的设置各个控件的属性值。
配置文件的例子:
<Class Name="article_projectdetail_aspx">
然后通过反射检索属性或者字段,然后设置值,如果需要对应不同的语言,可以在配置信息中指定,例如:
<Language Name="zh-CN">
</Language>
然后根据客户端支持的语言种类设置就好了。用这个方法的优点是比微软提供的方式简单,维护也比较方便,在性能上能够
应付一般的应用,而且可以随时添加新的语言类型的支持而不需要修改代码。以下是设置反射设置属性或者字段的代码。
/// <summary>
/// 设置属性或者字段
/// </summary>
/// <param name="instance">需要处理的实例</param>
/// <param name="key">属性或者字段的名称</param>
/// <param name="value">属性或者字段的值</param>
private static void ParsePropertyOrField(object instance, string key, string value)
{
//判断实例是否有效
if (null == instance)
{
//如果实例为空直接返回
return;
}
//判断Key是否为多级嵌入的属性
if (-1 == key.IndexOf('.'))
{
//获得成员的信息
System.Reflection.MemberInfo[] members = instance.GetType().GetMember(key,
System.Reflection.MemberTypes.Field |
System.Reflection.MemberTypes.Property,
System.Reflection.BindingFlags.IgnoreCase |
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Public);
//判断是否存在
if (0 == members.Length)
{
//如果不存在直接返回
return;
}
//判断是否为属性
if (System.Reflection.MemberTypes.Property == members[0].MemberType)
{
//如果是属性设置属性的值
((System.Reflection.PropertyInfo)members[0]).SetValue(instance, value, null);
}
else
{
//判断是否为字段
((System.Reflection.FieldInfo)members[0]).SetValue(instance, value);
}
}
else
{
//属性的序号
int fieldIndex = key.IndexOf('.');
//获得属性或者字段的名称
string fieldName = key.Substring(0, fieldIndex);
//获得成员的信息
System.Reflection.MemberInfo[] members = instance.GetType().GetMember(fieldName,
System.Reflection.MemberTypes.Field |
System.Reflection.MemberTypes.Property,
System.Reflection.BindingFlags.IgnoreCase |
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Public);
//判断是否存在
if (0 == members.Length)
{
//如果不存在直接返回
return;
}
//用于保存属性或者字段的值
object fieldObj = null;
//判断是否为属性
if (System.Reflection.MemberTypes.Property == members[0].MemberType)
{
//如果是属性获得属性的值
fieldObj = ((System.Reflection.PropertyInfo)members[0]).GetValue(instance, null);
}
else
{
//判断是否为字段
//如果是字段获得字段的值
fieldObj = ((System.Reflection.FieldInfo)members[0]).GetValue(instance);
}
//判断属性或者字段是否存在
if (null == fieldObj)
{
//如果不存在,那么直接返回
return;
}
//获得内嵌属性的名称
string innerName = key.Substring(fieldIndex + 1);
//如果含有嵌入的属性,那么执行递归调用
ParsePropertyOrField(fieldObj, innerName, value);
}
}
配置文件的例子:
<Class Name="article_projectdetail_aspx">
<Field Name="Title"
value="标题" />
<Field Name="labTitle.Text"
value="项目信息" />
</Class>
<Language Name="zh-CN">
</Language>
然后根据客户端支持的语言种类设置就好了。用这个方法的优点是比微软提供的方式简单,维护也比较方便,在性能上能够
应付一般的应用,而且可以随时添加新的语言类型的支持而不需要修改代码。以下是设置反射设置属性或者字段的代码。
/// <summary>
/// 设置属性或者字段
/// </summary>
/// <param name="instance">需要处理的实例</param>
/// <param name="key">属性或者字段的名称</param>
/// <param name="value">属性或者字段的值</param>
private static void ParsePropertyOrField(object instance, string key, string value)
{
//判断实例是否有效
if (null == instance)
{
//如果实例为空直接返回
return;
}
//判断Key是否为多级嵌入的属性
if (-1 == key.IndexOf('.'))
{
//获得成员的信息
System.Reflection.MemberInfo[] members = instance.GetType().GetMember(key,
System.Reflection.MemberTypes.Field |
System.Reflection.MemberTypes.Property,
System.Reflection.BindingFlags.IgnoreCase |
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Public);
//判断是否存在
if (0 == members.Length)
{
//如果不存在直接返回
return;
}
//判断是否为属性
if (System.Reflection.MemberTypes.Property == members[0].MemberType)
{
//如果是属性设置属性的值
((System.Reflection.PropertyInfo)members[0]).SetValue(instance, value, null);
}
else
{
//判断是否为字段
((System.Reflection.FieldInfo)members[0]).SetValue(instance, value);
}
}
else
{
//属性的序号
int fieldIndex = key.IndexOf('.');
//获得属性或者字段的名称
string fieldName = key.Substring(0, fieldIndex);
//获得成员的信息
System.Reflection.MemberInfo[] members = instance.GetType().GetMember(fieldName,
System.Reflection.MemberTypes.Field |
System.Reflection.MemberTypes.Property,
System.Reflection.BindingFlags.IgnoreCase |
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Public);
//判断是否存在
if (0 == members.Length)
{
//如果不存在直接返回
return;
}
//用于保存属性或者字段的值
object fieldObj = null;
//判断是否为属性
if (System.Reflection.MemberTypes.Property == members[0].MemberType)
{
//如果是属性获得属性的值
fieldObj = ((System.Reflection.PropertyInfo)members[0]).GetValue(instance, null);
}
else
{
//判断是否为字段
//如果是字段获得字段的值
fieldObj = ((System.Reflection.FieldInfo)members[0]).GetValue(instance);
}
//判断属性或者字段是否存在
if (null == fieldObj)
{
//如果不存在,那么直接返回
return;
}
//获得内嵌属性的名称
string innerName = key.Substring(fieldIndex + 1);
//如果含有嵌入的属性,那么执行递归调用
ParsePropertyOrField(fieldObj, innerName, value);
}
}