之前一直使用Enum.Parse()將字符串轉為枚舉,沒有深究,后面發現一個問題后對下面的Enum有了一個初步研究(.net 4.0).
枚舉是一個指定的常數集,其基礎類型可以是除 Char 外的任何整型。 如果沒有顯式聲明基礎類型,則使用 Int32。 Enum 是 .NET中所有枚舉的基類。
永遠不要創建基礎類型為非整形的枚舉類型。 雖然可以通過使用反射來創建這一枚舉類型,但使用得出的類型的方法調用是不可靠的,也可能會引發其他異常。
看下面代碼.
(留意,枚舉類型是值類型,其值不能為Null,所以我們定義一個枚舉類型,其默認值通常為該枚舉的第一個元素,或值為0的元素)
首先定義一個test枚舉
enum test { aaa,bbb,ccc,ddd}
(1)現在對比Parse方法(留意,parse方法里面value參數是區分大小寫的,如果想忽略大小寫,一定要使用帶ignoreCase參數的覆寫方法) private void button1_Click(object sender, EventArgs e) {
test te;
string typeStr;
te = (test)Enum.Parse(typeof(test), "4"); //4
typeStr = te.GetType().Name; //test
te = (test)Enum.Parse(typeof(test), "2"); //ccc
typeStr = te.GetType().Name; //test
te = (test)Enum.Parse(typeof(test), "ddd"); //ddd
te = (test)Enum.Parse(typeof(test), "ddd1"); //System.ArgumentException("未找到請求的值“ddd1”。")
}
那么看看TryParse方法呢?
//(留意,TryParse方法未經初始化即被賦值為默認值,如果不想TryParse方法改變Out的枚舉值,先調用 IsDefined()(IsDefined對於字符串區分大小寫的)方法
//以確保整數的特定字符串表示形式實際是 TEnum 的成員。)
test te = test.bbb;
if (Enum.TryParse("aaa", out te)) //aaa 返回值為True
MessageBox.Show(te.GetType().Name); //test
if (Enum.TryParse("111", out te)) //111 返回值為False
MessageBox.Show(te.GetType().Name);
TryParse方法的定義:
public static bool TryParse<TEnum>( string value, out TEnum result ) where TEnum : struct
TryParse方法有點奇特,只要是value能轉換為數字,那么一定會成功,如果不能,則根據大小寫(默認區分大小寫)去轉換.不存在就返回false.
結論,對於Enum.Parse() 方法,即使是想通過TryParse()方法判斷返回的bool值,也建議首先使用Enum.IsDefined()判斷是否存在.
(2)Enum.ToObject()方法
te = (test)Enum.ToObject(typeof(test), 4); //4
由此可見,ToObject()也同Parse方法一樣,對於數值,都不會引發ArgumentException,而轉換成功,所以也建議首先使用Enum.IsDefined()判斷是否存在.
(3)Enum.GetValues()方法
這個方法並不能獲取結果為{0,1,2,3}的數組,而是返回和GetNames()方法一樣的,只不過GetNames返回值類型為string[].
如果想獲取{0,1,2,3},參考這個方法
public static Array getValuesArray(Type enumType) { Array tempArry; tempArry = Enum.GetValues(enumType); //tempArry = enumType.GetEnumValues(); Array result = Array.CreateInstance(typeof(int), tempArry.Length); int j = 0; foreach (int i in tempArry) { result.SetValue(i, j++); } return result; }
(4) 一直說用Enum.IsDefined()方法判斷是否存在,那么還是看看這個方法吧.
bool b; b = Enum.IsDefined(typeof(test), 3);//True b = Enum.IsDefined(typeof(test), 4);//false b = Enum.IsDefined(typeof(test), "aaa");//true b = Enum.IsDefined(typeof(test), "aaA");//false b = Enum.IsDefined(typeof(test), "aaA1");//false
(5)現在在看看Enum.GetName(Type enumType, Object value)
方法對於字符串和整形是怎么樣處理的
string s; s = Enum.GetName(typeof(test), 3);//ddd s = Enum.GetName(typeof(test), 4);//null //s = Enum.GetName(typeof(test), "3");//System.ArgumentException(傳入的值必須是枚舉的枚舉基或基礎類型,如 Int32) //s = Enum.GetName(typeof(test), "aaa");//System.ArgumentException(傳入的值必須是枚舉的枚舉基或基礎類型,如 Int32)
基於以上的總結,以后但凡是想將字符串或整形轉為枚舉,那么首先用Enum.IsDefined()方法判斷,
對於字符串,用Parse或TryParse轉換,由於.net方法太多常見是不區分大小寫的,所以記得使用帶ignoreCase參數的覆寫方法.
對於整形,可以使用Parse和ToObject方法.將整數轉換為枚舉值時,可以分配一個實際並非枚舉成員的值。 為防止該情況,可在執行轉換前將該整數傳遞至 IsDefined() 方法。
將枚舉轉為字符串或整形值,可使用可通過調用靜態 Format 方法以及重載實例 ToString()方法.或GetName().
Enum 類提供 IConvertible 接口的顯式接口實現以從枚舉值轉換為整數類型,所以可以使用Convert.ToInt32.
Convert.ToInt32(test.aaa);
如果想將枚舉元素或(值)轉為字符串(整形),可用Enum.GetValues用(int)轉換一下.