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


    基本的思路是编写一个语言对应配置信息文件,然后使用反射动态的设置各个控件的属性值。
    配置文件的例子:
    <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);
                }
            }

  • 相关阅读:
    C++ std::stack 基本用法
    linux6 安装 ntopng
    linux 6安装 redis2.6
    Linux6搭建Tomcat服务器
    EXSI6.5忘记root密码
    python3笔记--数字
    python3笔记--运算符
    python3基本数据类型
    python3笔记
    centos6.X升级python3.X方法
  • 原文地址:https://www.cnblogs.com/zengezenge/p/822942.html
Copyright © 2020-2023  润新知