之前一直使用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)转换一下.

C# 中枚举的一点研究(跳过一些net坑的研究而已)的更多相关文章

  1. JDK中枚举的底层实现

    前提 上一篇文章复习介绍了JDK中注解的底层实现,跟注解一样比较常用,但是底层实现比较神秘的还有枚举类型.趁着国庆假期的最后两天,把JDK中枚举的底层实现也进行一次探究. 通过例子查找本质 在探究JD ...

  2. Swift 中枚举

    Swift 中枚举高级用法及实践 字数11017 阅读479 评论0 喜欢20 title: "Swift 中枚举高级用法及实践"date: 2015-11-20tags: [AP ...

  3. 《挑战30天C++入门极限》新手入门:C/C++中枚举类型(enum)

        新手入门:C/C++中枚举类型(enum) 如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型.之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来. ...

  4. js中页面刷新和页面跳转的方法总结

    .js中cookie的基本用法简介 2009-12-15 js中页面刷新和页面跳转的方法总结 文章分类:Web前端 关键字: javascript js中页面刷新和页面跳转的方法总结 1.histor ...

  5. javaWeb中servlet开发(4)——servlet跳转

    servlet跳转 1.跳转类型 客户端跳转:跳转后地址栏改变,无法传递request范围内属性,是在所有的操作都执行完毕之后才发生跳转的操作,跳转语法是,response.sendRedict() ...

  6. 遇到问题-----JS中设置window.location.href跳转无效(在a标签里或这form表单里)

    问题情况 JS中设置window.location.href跳转无效 代码如下: ? 1 2 3 4 5 6 7 8 <script type="text/javascript&quo ...

  7. iOS开发中,应用内直接跳转到Appstore

    iOS开发中,应用内直接跳转到Appstore 1.进入appstore中指定的应用NSString *str = [NSString stringWithFormat:                ...

  8. OD提示 "为了执行系统不支持的动作, OllyICE 在这个被调试的程序中注入了一点代码, 但是经过5秒仍未收到响应..." 解决办法

    别的OD就可以,我自己整合过的一个很顺手的OD就是不行,最后找到了解决办法: 转自:http://bbs.pediy.com/showthread.PHP?t=97629 -------------- ...

  9. js中页面刷新和页面跳转的方法总结 [ 转自欢醉同学 ]

    .js中cookie的基本用法简介 2009-12-15 js中页面刷新和页面跳转的方法总结 文章分类:Web前端 关键字: javascript js中页面刷新和页面跳转的方法总结 1.histor ...

随机推荐

  1. javascript方法的方法名慎用close

    通常我们在定义了与window同名的方法时,会自动覆盖掉window同名的方法.close()方法也不例外.示例: <!DOCTYPE html PUBLIC "-//W3C//DTD ...

  2. BandwagonHost搬瓦工VPS自建

    地址:https://bwh1.net/aff.php?aff=18648 ,购买$2.99的就够用了(现在没有$2.99的了,最低是$4.99) 步骤一: 步骤二: 步骤三:选图中的选项,然后点 A ...

  3. IDEA + Maven + JavaWeb项目搭建

    前言:在网上一直没找到一个完整的IDEA+Maven+Web项目搭建,对于IDEA和Maven初学者来说,这个过程简单但是非常痛苦的,对中间的某些步骤不是很理解,导致操作错误,从而项目发布不成功,一直 ...

  4. Lua5.3 注册表 _G _ENV

    Lua5.3 注册表 _G _ENV 来源:http://blog.csdn.net/murisly/article/details/46518551 注册表的描述,借用PIL中的一段话: regis ...

  5. KMP (next数组的性质及证明)

    性质:如果len%(len-next[len-1])==0,则字符串中必存在最小循环节,且循环次数即为len/(len-next[len-1]); 证明:在前len个字符组成的字符串,存在最小循环节k ...

  6. Day1作业要求

    Day1作业 作业需求 博客 模拟登录 三级菜单 博客地址 杨振伟Day1博客地址 模拟登录 1.程序说明 实现功能如下 用户输入密码,密码验证后登录成功 用户登录成功后提示登录信息 用户输入3次错误 ...

  7. c++学习笔记---03---从一个小程序说起2

    从一个小程序说起2 要求:编写一个程序,要求用户输入一串整数和任意数目的空格,这些整数必须位于同一行中,但允许出现在该行中的任何位置.当用户按下键盘上的"Enter"键时,数据输入 ...

  8. addEventListener和attachEvent二者绑定的执行函数中的this不相同【转载】

    yuanwen http://www.jb51.net/article/32511.htm 写 addEventListener 和 attachEvent 区别的博文不少,不过大部分都把重点放置于前 ...

  9. express的学习,与使用

    最近在学习vue的一个实战项目,碰到一个express,当时很萌,就随便看了看................ expres是基于node 的一个web框架, 首先可以找到它的官网照着学习 这里只讲一 ...

  10. 学Java的前景与就业,资深程序员教你怎么开始学Java!

    IT行业一直是就业的热门岗位,程序员这个职业稳定性和收入比都有着不错的前景,那么学Java的前景和就业是什么样的呢?随着入行Java的准程序员越来越多,各种学习Java的流派也层出不穷!其实在编程的世 ...