zoukankan      html  css  js  c++  java
  • C#资源文件和C#枚举如何结合使用?

       最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。我们都知道计算机技术发展日新月异,速度惊人的快,你我稍不留神,就会被慢慢淘汰!因此:每日不间断的学习是避免被淘汰的不二法宝。

       当然,题外话说多了,咱进入正题!

    先说说枚举:

    枚举类型(也称为枚举)为定义一组可以赋给变量的命名整数常量提供了一种有效的方法。 例如,假设您必须定义一个变量,该变量的值表示一周中的一天。 该变量只能存储七个有意义的值。 若要定义这些值,可以使用枚举类型。枚举类型是使用 enum关键字声明的。

     
    enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
    enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; 
    

    默认情况下,枚举中每个元素的基础类型是 int

    可以通过转换验证基础数值与基础类型,如下例所示。

     
    Days today = Days.Monday;
    int dayNumber =(int)today;
    Console.WriteLine("{0} is day number #{1}.", today, dayNumber);
    
    Months thisMonth = Months.Dec;
    byte monthNumber = (byte)thisMonth;
    Console.WriteLine("{0} is month number #{1}.", thisMonth, monthNumber);
    
    // Output:
    // Monday is day number #1.
    // Dec is month number #11.
    

    以下是使用枚举而不使用数值类型的好处:

    • 明确为客户端代码指定哪些值是变量的有效值。

    • 在 Visual Studio 中,IntelliSense 列出定义的值。

    如果未在枚举数列表中指定元素的值,则值将自动按 1 递增。 在前面的示例中,Days.Sunday 的值为 0,Days.Monday 的值为 1,依此类推。 创建新的 Days 对象时,如果不显式为其赋值,则它将具有默认值 Days.Sunday (0)。 创建枚举时,应选择最合理的默认值并赋给它一个零值。 这便使得只要在创建枚举时未为其显式赋值,则所创建的全部枚举都将具有该默认值。

    如果变量 meetingDay 的类型为 Days,则只能将 Days 定义的某个值赋给它(无需显式强制转换)。 如果会议日期更改,可以将 Days 中的新值赋给meetingDay:

     
    Days meetingDay = Days.Monday;
    //...
    meetingDay = Days.Friday;
    
    System_CAPS_note注意

    可以将任意整数值赋给 meetingDay。 例如,代码行 meetingDay = (Days) 42 不会产生错误。 但也不应该这样做,因为默认约定的是枚举变量只容纳枚举定义的值之一。 将任意值赋给枚举类型的变量很有可能会导致错误。

    可以将任意值赋给枚举类型的枚举数列表中的元素,也可以使用计算值:

     
    enum MachineState
    {
        PowerOff = 0,
        Running = 5,
        Sleeping = 10,
        Hibernating = Sleeping + 5
    }
    
       但凡大点的项目,都会要求程序的国际通用性,也就是说:你写的程序,不仅要支持中文,还应该支持英文,日文,阿拉伯文,甚至火星文,太阳文等。
       最近在做一个名曰:’OLAY‘的化妆品项目,公司的基本要求就是本项目做完后,后续类似的化妆品项目可以套用,不管这个化妆品品牌是英国的,法国的,日本的,火星的,美国的等。
       这样就遇到一个问题:例如:一个Lable控件,用来标注商品名称,你把lable的Text设置为:商品名称,在本项目中没有任何问题,但:如果后期这个项目要拿到美国用咋办?美国人毕竟不懂中文啊!为了解决这个问题,我们要请资源文件闪亮登场喽。
       资源文件其实很简单,但用处相当的大,在此仅做最基本的解读。如下:
       1.打开您的项目,添加一个项,命名为SysConfig:

    然后向资源文件中添加几个测试键值对(中间的部分让我盖住了,姑且认为是火星文吧):

     写入了一些键值对后,我们就可以使用这个资源文件作测试了,如下:
    首先写一个读取资源文件的方法
     /// <summary>
            /// 获取资源文件--根据资源文件键的名字,取出对应的值
            /// </summary>
            /// <param name="ResourceCode">ResourceCode</param>
            /// <returns></returns>
            public static string GetResourceString(string ResourceCode)
            {
                return SysConfig.ResourceManager.GetString(ResourceCode);
            }

    这样就可以读取资源文件了

    如上述提出的程序通用的问题,Lable控件的Text属性如何设置值?如何达到在中国能运行,在美国能运行,在火星能运行?

    在此:你可以把在中国的取值放在一个资源文件中,在美国的取值放在另一个资源文件中,在火星上的取值放在火星文对应的资源文件中,也就是说:在项目中在新建你需要的资源文件,例如:Sys_Config_China资源文件中存储的是中文,在Sys_Config_US资源文件中存储的是英文,在Sys_Config_Marks资源文件中存放火星文。但要注意一点,他们存储的键值对中的‘剑’必须一致,否则将做不到通用性!

    这样,一个项目在各个国家就可以做到通用了!

    当然,要想做到程序真正的通用,仅靠资源文件是不行的,您写程序的水平也是至关重要滴,举个简单例子哈:

    时间戳都用吧,时间戳转化为时间怎么转换?时间戳的格式有几种?

    当一个方法传入一个时间戳,让您转化为时间,您打算怎么做?怎样写通用的程序?

    在此,您首先要知道时间戳分为: linux 时间戳 和 unix时间戳两种,在您进行转化之前,您至少要判断传入的时间戳属于哪一种,然后再调用对应的方法进行转换!

    当然,本篇主要讲解资源文件的枚举的结合使用,在此,关于时间戳的话题先放放。

    首先先贴点代码哈

     /// <summary>
        /// test
        /// </summary>
        public enum shopInfo
        {
            shopName,
            shopAddress,
            shopTel,
        }
    
        public enum NoticeType
        {
            Notice = 'A',
            LabRule = 'H',
            HotInformation = 'N',
            Column = 'C',
            All = '1',
            Null = '0'
        }

    上述代码,大家都知道,这是C#的枚举,那您接着往下看哈

      /// <summary>
        /// 将枚举值存入资源文件
        /// </summary>
        public enum weixinParm
        {
            [EnumCode("apisecret")]//对应资源文件中的Key值  方便遍历时寻找
            apisecret,
            [EnumCode("appid")]
            appid,
            [EnumCode("appsecret")]
            appsecret,
            [EnumCode("duokefu")]
            duokefu,
            [EnumCode("mchid")]
            mchid,
            [EnumCode("orderSuccessid")]
            orderSuccessid ,
            [EnumCode("paySuccessid")]
            paySuccessid
        }

    吆喝,这个EnumCode是什么东西呐?怎嘛感觉这个东西有点像MVC中的那个啥呢、

    其实吧,这个EnumCode是个类,这类可以将C#资源文件和枚举整合,如下:

      /// <summary>
        /// 枚举的资源名称描述-
        /// </summary>
        [AttributeUsage(AttributeTargets.Field)]
        public class EnumCode : Attribute
        {
            private string _code;
            private FieldInfo _fieldInfo;
    
            public EnumCode(string code)
            {
                _code = code;
            }
    
            public string FieldCode
            {
                get { return _code; }
            }
    
            public int FieldValue
            {
                get { return (int)_fieldInfo.GetValue(null); }
            }
    
            public string FieldName
            {
                get { return _fieldInfo.Name; }
            }
    
            static Dictionary<string, List<EnumCode>> _cached = new Dictionary<string, List<EnumCode>>();
    
            public static string GetFieldCode(object enumValue)
            {
                List<EnumCode> codes = GetEnumCode(enumValue.GetType());
                foreach (EnumCode code in codes)
                {
                    if (code.FieldName == enumValue.ToString())
                    {
                        return code.FieldCode;
                    }
                }
                return string.Empty;
            }
    
            public static List<EnumCode> GetEnumCode(Type enumType)
            {
                List<EnumCode> result = null;
                if (!_cached.ContainsKey(enumType.FullName))
                {
                    result = new List<EnumCode>();
                    FieldInfo[] fields = enumType.GetFields();
                    foreach (FieldInfo field in fields)
                    {
                        object[] objs = field.GetCustomAttributes(typeof(EnumCode), false);
                        if (objs.Length != 1)
                        {
                            continue;
                        }
                        ((EnumCode)objs[0])._fieldInfo = field;
                        result.Add((EnumCode)objs[0]);
                    }
                    _cached[enumType.FullName] = result;
                }
                result = _cached[enumType.FullName];
                return result;
            }
        }

    至此:根据上述这个类,我们就可以结合枚举和资源文件了,

    下面是我做的测试代码,贴给大家,有遍历枚举的,有取枚举节点的,更有遍历枚举和资源文件结合的,总之,无所不能

            /// <summary>
            /// 遍历和资源文件结合的枚举
            /// </summary>
            /// <returns></returns>
            public static void ForEachParm()
            {
                foreach (string Type in Enum.GetNames(typeof(weixinParm)))
                {
                    weixinParm type = (weixinParm)Enum.Parse(typeof(weixinParm), Type);
                    string Key = type.ToString();
                    string ResourceValue= SysConfig.ResourceManager.GetString(EnumCode.GetFieldCode(type));//获取资源文件中存储的值
                    string EnumValue = type.GetHashCode().ToString();
                }
            }
    
            /// <summary>
            /// 遍历普通枚举 
            /// </summary>
            /// <returns></returns>
            public static void ForEachEnum()
            {
                foreach (string Type in Enum.GetNames(typeof(shopInfo)))
                {
                    shopInfo type = (shopInfo)Enum.Parse(typeof(shopInfo), Type);
                    string Key = type.ToString();
                    string EnumValue = type.GetHashCode().ToString();
                }
            }
    
            /// <summary>
            /// 根据枚举Key 获取枚举的序号 
            /// </summary>
            /// <returns></returns>
            public static void ForEachEnum(shopInfo parm)
            {
                shopInfo type = parm;
                string Key = type.ToString();
                string EnumValue = type.GetHashCode().ToString();
            }

    好吧,截止到这儿,就基本讲完了,废话不多说了,今儿最后一天上班,明儿我就回家喽,十一7天假,我想和我的小美女约个会哈,但是,有心人胆不足呐!

    小伙伴们,我该肿么办呢?

    @陈卧龙的博客--2016-9-29


     
     
  • 相关阅读:
    备份一些觉得很有用的网站或者资料或者新的一些属性方法技术
    ios下iphone的plus下
    四川大学2008年数学分析考研试题
    四川大学2007年数学分析考研试题
    四川大学2006年数学分析考研试题
    四川大学2005年数学分析考研试题
    四川大学2003年数学分析考研试题
    四川大学2002年数学分析考研试题
    四川大学2001年数学分析考研试题
    四川大学2000年数学分析考研试题
  • 原文地址:https://www.cnblogs.com/chenwolong/p/Resource.html
Copyright © 2011-2022 走看看