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

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

先说说枚举:

枚举类型(也称为枚举)为定义一组可以赋给变量的命名整数常量提供了一种有效的方法。 例如,假设您必须定义一个变量,该变量的值表示一周中的一天。 该变量只能存储七个有意义的值。 若要定义这些值,可以使用枚举类型。枚举类型是使用 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
}
   但凡大点的项目,都会要求程序的国际通用性,也就是说:你写的程序,不仅要支持中文,还应该支持英文,日文,阿拉伯文,甚至火星文,太阳文等。
   最近在做一个名曰:’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 = '',
Null = ''
}

上述代码,大家都知道,这是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 != )
{
continue;
}
((EnumCode)objs[])._fieldInfo = field;
result.Add((EnumCode)objs[]);
}
_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#枚举如何结合使用?的更多相关文章

  1. ASP.NET Core中结合枚举和资源文件显示列表

    模型类的某些属性以枚举形式出现,我们希望在打开编辑表单时在选择列表中显示枚举值.有时我们想要枚举元素名称,但有时我们想要使用自定义名称甚至翻译. 这个例子演示了如何获取枚举元素名称以选择ASP.NET ...

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

    .Net平台下工作好几年了,资源文件么,大多数使用的是.resx文件.它是个好东西,很容易上手,工作效率高,性能稳定.使用.resx文件,会在编译期动态生成已文件名命名的静态类,因此它的访问速度当然是 ...

  3. android资源文件的选取

    Android app项目中,res是用来存放资源文件的,来看看这些文件的创建和选取规则: 系统启动一个apk后,生成UI的过程中,会根据不同的系统配置来匹配.选择相应的资源文件. You shoul ...

  4. Springboot 使用 JSR 303 对 Controller 控制层校验及 Service 服务层 AOP 校验,使用消息资源文件对消息国际化

    导包和配置 导入 JSR 303 的包.hibernate valid 的包 <dependency> <groupId>org.hibernate.validator< ...

  5. WPF绑定资源文件错误(error in binding resource string with a view in wpf)

    报错:无法将"***Properties.Resources.***"StaticExtension 值解析为枚举.静态字段或静态属性 解决办法:尝试右键单击在Visual Stu ...

  6. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  7. ABP文档 - 嵌入的资源文件

    文档目录 本节内容: 简介 创建嵌入的文件 暴露嵌入的文件 使用嵌入的文件 简介 一个web应用里,客户端包含javascript,css,xml等文件,这此文件被添加到一个web项目后,发布成独立的 ...

  8. Xamarin+Prism开发详解二:Xaml文件如何简单绑定Resources资源文件内容

    我们知道在UWP里面有Resources文件xxx.resx,在Android里面有String.Xml文件等.那跨平台如何统一这些类别不一的资源文件以及Xaml设计文件如何绑定这些资源?应用支持多国 ...

  9. 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践

    提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...

随机推荐

  1. Apache Storm技术实战之3 -- TridentWordCount

    欢迎转载,转载请注明出处. 介绍TridentTopology的使用,重点分析newDRPCStream和stateQuery的实现机理. 使用TridentTopology进行数据处理的时候,经常会 ...

  2. oracle创建dblink问题

    1.如果在本地"D:\oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora"中设置 服务器数据库连接,必须再服务器设置 ...

  3. 下面我会介绍几种轻轻松松访问Google的方法

    好人一生平安的大招 Google在大陆已经封了差不多有20天   访问是极其的困难 下面我会介绍几种轻轻松松访问Google的方法 首先 你需要个可靠的hosts  比如 https://git.os ...

  4. 8 个最佳 PHP 库

    PHP标准库 (SPL)的目的就是提供一组接口,让开发者在PHP5中充分利用面向对象编程.因此本文我们搜集了8个最好的,能辅助开发者简化他们的工作,为他们的开发任务服务的PHP库. 如果你喜欢本文,也 ...

  5. Windows与Linux共享文件夹互相访问

    [原文]  首先安装并配置软件samba [html] view plain copy sudo yum install samba samba-client vim /etc/samba/smb.c ...

  6. A2DP协议笔记

    1.概述     A2DP(Advanced Audio Distribution Profile)是蓝牙的音频传输协议,典型应用为蓝牙耳机.A2DP协议的音频数据在ACL Link上传输,这与SCO ...

  7. const 修饰函数

    At the very first ,I got a problem . Vector Vector::operator+(const Vector &v)const{ return Vect ...

  8. How to disable and clear query ranges in sysquery form

    query = new query('Query name'); queryBuildDataSource = query.dataSourceTable(tableNum('table name') ...

  9. block 反向传值回调

    /** *  block 反向传值回调 */ //在第二个控制器中 //   (1)声明block,在基类中已写好 //   (2)写好传值方法 //(1) typedef void (^Return ...

  10. js - 驼峰命名

    1. // 驼峰命名 console.log(hump('border-bottom-color')) function hump( str) { if (typeof str != 'string' ...