博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

如何使用反射技术实现ASP.NET国际化站点

Posted on 2007-07-18 19:56  我是程序员  阅读(561)  评论(1编辑  收藏  举报
基本的思路是编写一个语言对应配置信息文件,然后使用反射动态的设置各个控件的属性值。
配置文件的例子:
<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);
            }
        }