C#资源文件和C#枚举如何结合使用?
Posted 天才第一步,雀氏纸尿布
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
注意 |
---|
可以将任意整数值赋给 meetingDay。 例如,代码行 meetingDay = (Days) 42 不会产生错误。 但也不应该这样做,因为默认约定的是枚举变量只容纳枚举定义的值之一。 将任意值赋给枚举类型的变量很有可能会导致错误。 |
可以将任意值赋给枚举类型的枚举数列表中的元素,也可以使用计算值:
enum MachineState { PowerOff = 0, Running = 5, Sleeping = 10, Hibernating = Sleeping + 5 }
然后向资源文件中添加几个测试键值对(中间的部分让我盖住了,姑且认为是火星文吧):
/// <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
以上是关于C#资源文件和C#枚举如何结合使用?的主要内容,如果未能解决你的问题,请参考以下文章