之前一直使用Enum.Parse()将字符串转为枚举,没有深究,后面发现一个问题后对下面的Enum有了一个初步研究(.net 4.0).看下面代码.
(留意,枚举类型是值类型,其值不能为Null,所以我们定义一个枚举类型,其默认值通常为该枚举的第一个元素,或值为0的元素class="parameter">)
首先定义一个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 方法以确保整数的特定字符串表示形式实际是 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; }