之前一直使用Enum.Parse()將字元串轉為枚舉,沒有深究,後面發現一個問題後對下麵的Enum有了一個初步研究(.net 4.0).看下麵代碼. 首先定義一個test枚舉 結論,對於Enum.Parse() 方法,即使是想通過TryParse()方法判斷返回的bool值,也建議首先使用Enum. ...
之前一直使用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;
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方法呢?
test te = test.bbb;
//(留意,TryParse方法未經初始化即被賦值為預設值,如果不想TryParse方法改變Out的枚舉值,先調用 IsDefined()(IsDefined對於字元串區分大小寫的)方法
//以確保整數的特定字元串表示形式實際是 TEnum 的成員。)
if (Enum.TryParse("aaa", out te)) //aaa
MessageBox.Show(te.GetType().Name); //test
if (Enum.TryParse("111", out te)) //111
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)轉換一下.