zoukankan      html  css  js  c++  java
  • 如何使用反射技术实现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);
                }
            }

  • 相关阅读:
    大道至简第二章读后感
    读大道至第一章简有感
    二次封装Response类
    视图与序列化传参
    Codeforces Round #523 (Div. 2) F. Katya and Segments Sets (交互题+思维)
    Codeforces Round #510 (Div. 2) D. Petya and Array(离散化+反向树状数组)
    Codeforces 1060E(思维+贡献法)
    Codeforces Round #520 (Div. 2) E. Company(dfs序判断v是否在u的子树里+lca+线段树)
    Codeforces Round #513 by Barcelona Bootcamp C. Maximum Subrectangle(双指针+思维)
    Educational Codeforces Round 51 F. The Shortest Statement(lca+最短路)
  • 原文地址:https://www.cnblogs.com/zengezenge/p/822942.html
Copyright © 2011-2022 走看看