原文地址
Enum為枚舉提供基類于未,其基礎(chǔ)類型可以是除 Char 外的任何整型撕攒。如果沒(méi)有顯式聲明基礎(chǔ)類型,則使用Int32烘浦。編程語(yǔ)言通常提供語(yǔ)法來(lái)聲明由一組已命名的常數(shù)和它們的值組成的枚舉抖坪。
注意:枚舉類型的基類型是除 Char 外的任何整型,所以枚舉類型的值是整型值闷叉。
Enum 提供一些實(shí)用的靜態(tài)方法:
- 比較枚舉類的實(shí)例的方法
- 將實(shí)例的值轉(zhuǎn)換為其字符串表示形式的方法
- 將數(shù)字的字符串表示形式轉(zhuǎn)換為此類的實(shí)例的方法
- 創(chuàng)建指定枚舉和值的實(shí)例的方法擦俐。
舉例:enum Colors { Red, Green, Blue, Yellow };
Enum->String
- 利用
Object.ToString()
方法:如Colors.Green.ToString
的值是Green
字符串 - 利用
Enum
的靜態(tài)方法GetName
與GetNames
public static string GetNames(Type enumType,Object value)
public static string[] GetNames(Type enumType)
例如:
Enum.GetNames(typeof(Colors),3))
與Enum.GetName(typeof(Colors),Colors.Bule))
的值都是Blue
.
Enum.GetNames(typeof(Colors))
將返回枚舉字符串?dāng)?shù)組.
String->Enum
- 利用
Enum
的靜態(tài)方法Parse
:
public static Object Parse(Type enumType,string value)
例如:
(Colors)Enum.Parse(typeof(Colors),"Red")
Int->Enum
- 可以強(qiáng)制轉(zhuǎn)換,將整型轉(zhuǎn)換成枚舉型
例如:Colors color = (Colors)2
,那么color
即為Colors.Blue
- 利用
Enum
的靜態(tài)方法ToObject
public static Object ToObject(Type enumType,int value)
例如:Colors color = (Colors)Enum.ToObject(typeof(Colors),2)
握侧,那么color
即為Color.Blue
判斷某個(gè)類型是否定義在枚舉中的方法 Enum.IsDefined
public static bool IsDefined(Type enumType,Object value)
例如:Enum,IsDefined(typeof(Colors),n))
public enum EmployeeType
{
RegularEmployee,
StoreManager,
ChainStoreManager,
DepartmentManager,
Supervisor
}
我們可以通過(guò)ToString()
的方法簡(jiǎn)單的獲取到下列信息
EmployeeType employee = EmployeeType.ChainStoreManager;
Console.WriteLine(employee.ToString());
Console.WriteLine(EmployeeType.ChainStoreManager.ToString());
輸出結(jié)果:
ChainStoreManager
ChainStoreManager
但我們?nèi)绾尾拍軐⑷〉玫慕Y(jié)果類似"Chain Store Manager"
包含空格呢蚯瞧?我么不能去創(chuàng)建一個(gè)包含空格的枚舉成員,否則你的代碼將不能編譯通過(guò)品擎,事實(shí)上我們有很多方法可以解決這個(gè)問(wèn)題
- 在枚舉成員和字符串之間創(chuàng)建一個(gè)映射(可以使用數(shù)組或哈希表)
- 將枚舉成員
ToString()
的結(jié)果作為鍵制定到資源文件 - 使用反射(我將在下面講到)
在枚舉中使用屬性
我將使用屬性來(lái)達(dá)到一個(gè)字符串關(guān)聯(lián)到枚舉成員的目的埋合,下面通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明這是如何做到的。
public class EnumDescriptionAttribute : Attribute
{
private string m_strDescription;
public EnumDescriptionAttribute(string strPrinterName)
{
m_strDescription = strPrinterName;
}
public string Description
{
get { return m_strDescription; }
}
}
EnumDescriptionAttribute
類繼承自Attribute
萄传,它包含一個(gè)類型為String
的屬性Description
,下面將改屬性關(guān)聯(lián)到枚舉EmployeeType
的所有成員上甚颂。
public enum EmployeeType
{
[EnumDescription("Regular Employee")]
RegularEmploye,
[EnumDescription("Store Manager")]
StoreManager,
[EnumDescription("Chain Store Manager")]
ChainStoreManager,
[EnumDescription("Department Manager")]
DepartmentManager,
[EnumDescription("On Floor Supervisor")]
Supervisor
}
從枚舉獲得到屬性的值
為了獲取到屬性的值,我必須使用到反射秀菱,下面是一個(gè)簡(jiǎn)單的例子:
// setup the enum
EmployeeType employee = EmployeeType.ChainStoreManager;
// get the field informaiton
FieldInfo fieldInfo = employee.GetType().GetField("ChainStoreManager");
// get the attributes for the enum field
object[] attribArray = fieldInfo.GetCustomAttributes(false);
// cast the one and only attribute to EnumDescriptionAttribute
EnumDescriptionAttribute attrib = (EnumDescriptionAttribute)attribArray[0];
// write the description
console.WriteLine("Description: {0}", attrib.Description);
輸出結(jié)果:
Chain Store Manager
其中最重點(diǎn)的一行代碼:FieldInfo fieldInfo = employee.GetType().GetField("ChainStoreManager");
,我們注意硬編碼到里面的枚舉成員ChainStoreManager
實(shí)際上可以通過(guò)ToString()
方法來(lái)代替振诬。