C#资源文件和C#枚举如何结合使用?

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

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

先说说枚举:

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

C#

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

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

C#

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:

C#

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

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

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

C#

enum MachineState
{
    PowerOff = 0,
    Running = 5,
    Sleeping = 10,
    Hibernating = Sleeping + 5
}

上述这些是参考MSDN上的说法,今天主要讲解枚举和资源文件这两个难兄难弟!

资源文件顾名思义是存储资源的,也是程序国际化、通用化必不可少的一种项目文件,在此:举个小例子:

如下:

但凡大点的项目,都会要求程序的国际通用性,也就是说:你写的程序,不仅要支持中文,还应该支持英文,日文,阿拉伯文,甚至火星文,太阳文等。

最近在做一个名曰:’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

时间: 2024-10-13 20:47:51

C#资源文件和C#枚举如何结合使用?的相关文章

.NET MVC4 实训记录之五(访问自定义资源文件)

.Net平台下工作好几年了,资源文件么,大多数使用的是.resx文件.它是个好东西,很容易上手,工作效率高,性能稳定.使用.resx文件,会在编译期动态生成已文件名命名的静态类,因此它的访问速度当然是最快的.但是它也有个最大的缺点,就是修改资源文件后,项目必须重新编译,否则修改的资源不能被识别.这对于维护期的工作来讲,非常麻烦.尤其是已经上线的项目,即使是修改一个title的显示,也需要停掉项目.由于本人做了好几年的维护,应该是从工作到现在,一直没有间断过的做维护项目,因此深受其害!必须找到一个

C#创建和使用资源文件

创建资源文件     资源文件顾名思义就是存放资源的文件.资源文件在程序设计中有着自身独特的优势,他独立于源程序,这样资源文件就可以被多个程序使用.同时在程序设计的时候,有时出于安全或者其他方面因素的考虑,把重要东西存放在资源文件中,也可以达到保密.安全的效果.那么Visual C#所使用的资源文件中到底存放哪些东西呢?在用Visual C#创建资源文件大致可以存放三种类型的数据资源,分别是字节数组.各种对象和字符串.本文将结合一个程序例子来具体说明用Visual C#是如何创建资源文件的. 一

.Net 多语言 与资源文件

目前很多网站都支持多语言,特别是中英文.而.Net网站中的多语言就要用到资源文件.资源文件分为全局资源文件(App_GlobalResource)以及本地资源文件(App_LocalResource). 创建资源文件 对于一个项目,我们一般都会创建全局资源文件以及本地资源文件.我们可以首先新建两个文件夹:App_GlobalResource,App_LocalResource. 1. 创建本地资源文件(App_LocalResource) 本地资源文件是针对于某个页面资源信息.所以,原则上我们应

iOS工程 与 资源文件 和 Bundle

在简单的app中,可能只会用到工程,但是项目越大,越复杂,就会需要拆分项目,将各个功能拆散到各个工程中. 可以使用worksapce来管理工程集合. 但是资源文件却不好管理,因为xcode默认只能添加自己工程内,或者子工程的资源文件到target中. 如果是平级的工程,怎么添加呢?可以使用bundle bundle虽然是os x中的资源类型,但是是兼容iOS的 我们可以先创建一个os x的bundle,然后修改其编译类型为iOS的 调整base sdk即可 然后添加资源文件(png,xib,st

win10 uwp 读取resw资源文件

ResourceContext resourceContext = ResourceContext.GetForViewIndependentUse(); ResourceMap resourceMap = Windows.ApplicationModel.Resources.Core.ResourceManager.Current.MainResourceMap.GetSubtree("my"); // Here you load the resource you need var

Spring boot 国际化自动加载资源文件问题

Spring boot 国际化自动加载资源文件问题 最近在做基于Spring boot配置的项目.中间遇到一个国际化资源加载的问题,正常来说只要在application.properties文件中定义正确的资源文件路径,Spring boot就启动时就会自动加载资源. spring.messages.basename=i18n/message 但是我的项目修改后获取消息时系统报错,找不到对应语言的资源配置.于是试图找到原因.Google好久都没找到,简直好像就我一个人遇到这鬼问题一样??.只好自

Solidity编程 三 之 资源文件的组成

3.1 版本语句 源文件可以用版本语句拒绝高版本编译器编译.其中一些高版本可能引入了不兼容的特性,导致编译后出现不可预知的结果.我们希望把这种版本变化控制在最小范围内,同时尽量要求语法和语义同步修改,这个要求很难达到.所以,我们需要去阅读每个版本的修改日志,这些版本都是以 0.X.0或是X.0.0来命名. 版本语句使用如下: pragma solidity ^0.4.0; 这样的源文件不会被0.4.0以前的编译器编译,同时在0.5.0版本以上(包括0.5.0)编译器上也不能编译(使用了 ^ 进行

struts2官方 中文教程 系列七:消息资源文件

介绍 在本教程中,我们将探索使用Struts 2消息资源功能(也称为 resource bundles 资源绑定).消息资源提供了一种简单的方法,可以将文本放在一个视图页面中,通过应用程序,创建表单字段标签,并根据用户的语言环境将文本更改为特定的语言. 贴个本帖的地址,以免被爬:struts2官方 中文教程 系列七:消息资源文件  即 http://www.cnblogs.com/linghaoxinpian/p/6906720.html 下载本章节代码 信息资源属性文件 在Struts2 we

二、添加资源文件

Qt资源系统是一个跨平台的资源机制,可以将各种类型的文件以二进制的方式存储与可执行文件内部.使用Qt Creator可以很方便的创建资源文件.在工程上点击右键选择"添加新文件",可在Qt分类中找到Qt资源文件(Qt Resource File),如下图所示,将其命名为res: 创建完成后会自动打开资源文件,在界面右侧编辑区,有个添加按钮 .如下图: 我们需要先添加前缀,点击添加选择添加前缀,默认前缀是"/new/prefix1",这个可以随便更改但是不要使用中文字符