新聞中心
本文主要是我在實(shí)際項(xiàng)目中對(duì)C#枚舉的應(yīng)用總結(jié),如果存在不足的地方歡迎您指出。

一、枚舉基本運(yùn)用
1、枚舉其實(shí)可以理解為一個(gè)恒量的結(jié)合,又或者可以認(rèn)為它是一種類型。比如以下枚舉定義:
- public enum MicrosoftTechnology
- {
- CSharp,
- ASPNETMVC,
- SQLServer,
- WCF,
- SilverLight,
- }
此枚舉默認(rèn)值為int型,當(dāng)然我們可以根據(jù)需要指定枚舉的數(shù)據(jù)類型。比如 public enum MicrosoftTechnology: long{....} 等。MicrosoftTechnology枚舉int值分別為
Csharp:0;ASPNETMVC:1;SQLServer:2;WCF:3;SilverLight:4, 以自增1的形式自動(dòng)賦值。當(dāng)然也可以指定每個(gè)枚舉項(xiàng)的值。
2、枚舉的位運(yùn)算:
Flag特性表示枚舉支持位運(yùn)算。一般情況下我們用到的位運(yùn)算符有:&(與)、|(或)、~(非)。
首先我們?yōu)槊杜e加上[Flags]特性后再指定枚舉值。
將1、中的代碼修改如下:
- [Flags] public enum MicrosoftTechnology
- {
- CSharp = 1,
- ASPNETMVC = 2,
- SQLServer = 4,
- WCF = 8,
- SilverLight = 16,
- }
這里指定枚舉值主要是為了使用與、或、非這三個(gè)位運(yùn)算符。將枚舉值轉(zhuǎn)化成二進(jìn)制值:
CSharp: 1 = 0001
ASPNETMVC: 2 = 0010
SQLServer: 4 = 0100
WCF: 8 = 1000
SilverLight: 16 = 10000
舉例說(shuō)明:如果某位開(kāi)發(fā)者選擇兩項(xiàng)微軟技術(shù)分別為CSharp和ASPNETMVC 用位運(yùn)算表達(dá)為 0001 | 0010 = 0011。經(jīng)過(guò)不懈的努力這位開(kāi)發(fā)者掌握了以上兩項(xiàng)技術(shù)“0011”?,F(xiàn)在我們想通過(guò)位運(yùn)算檢測(cè)出這位開(kāi)發(fā)者是否精通CSharp:代碼為:
(MicrosoftTechnology.CSharp|MicrosoftTechnology.ASPNETMVC) & MicrosoftTechnology.CSharp 等同 (0001 | 0010 = 0011)& 0001 等于 0001(CSharp :1)
講到這里我想您應(yīng)該不難理解:為了對(duì)枚舉運(yùn)用位操作時(shí)指定枚舉值的緣故了。非(~)操作符這里就留給讀者自己實(shí)踐了。
二、為枚舉進(jìn)行本地化
通過(guò).net泛型機(jī)制編寫(xiě)枚舉本地化通用方法,代碼如下:
- ///
- /// 本地化枚舉通用方法
- ///
- ///
- ///
Ryanding - private static string LocalizeEnumeration(object enumerator)
- {
- ResourceManager resources = new ResourceManager("resx文件名",
- System.Reflection.Assembly.GetExecutingAssembly());
- string name = String.Format("{0}.{1}.Text", enumerator.GetType().Name, enumerator);
- string localizedDescription = resources.GetString(name);
- if (localizedDescription == null)
- return enumerator.ToString();
- else18 return localizedDescription;
- }
- ///
- /// 翻譯枚舉成中文
- ///
- public static List
GetEnumStringList () - {
- string[] resultPrepare = Enum.GetNames(typeof(T));
- List
result = new List (); - Array.ForEach(resultPrepare, f => result.Add(new KeyValuePair
- {
- Key = (int)(Enum.Parse(typeof(T), f)),
- Value = LocalizeEnumeration(Enum.Parse(typeof(T), f))
- }
- ));
- return result;
- }
通過(guò)以上代碼,可以認(rèn)為枚舉也是一種類型。這里通過(guò)泛型機(jī)制將枚舉本地化統(tǒng)一處理。
三、枚舉在ORM中提高程序可讀性
以LinqToSQL來(lái)列舉枚舉在ORM中的作用:
在大中型系統(tǒng)中設(shè)計(jì)數(shù)據(jù)庫(kù)表時(shí),比如有一張Customer表,存在一字段CustomerType(int 型) 。
CustomerType 枚舉定義如下:
- public enum CustomerType
- {
- Trader = 0,
- Supplier = 1,
- Logistics = 2,
- }
Customer表結(jié)構(gòu)如下:
LinqTosql debug如下:
可以看出LinqTosql 已經(jīng)很“完美”的將LINQ語(yǔ)句解析成SQL語(yǔ)句。這樣當(dāng)我們的業(yè)務(wù)變得相對(duì)復(fù)雜,枚舉狀態(tài)數(shù)量也逐漸增加時(shí),開(kāi)發(fā)者無(wú)需硬記0,1,2,3這些到底代表數(shù)據(jù)的何種業(yè)務(wù)狀態(tài)。通過(guò)枚舉映射到ORM,我們的代碼可讀性進(jìn)一步加強(qiáng)。當(dāng)然更便于維護(hù)了!
最后希望本篇文章可以給您帶來(lái)幫助,如有不足之處歡迎指出,謝謝!
文章題目:總結(jié)C#枚舉在開(kāi)發(fā)項(xiàng)目中的應(yīng)用
本文地址:http://fisionsoft.com.cn/article/dhppcoi.html


咨詢
建站咨詢
