原文地址:http://blog.csdn.net/aimeast/article/details/4516323

先看一个例子:

[c-sharp] view plaincopy
  1. enum MyEnum
  2. {
  3. A = 1,
  4. B = 2,
  5. C = 3,
  6. }

执行下面代码

[c-sharp] view plaincopy
  1. MyEnum e = (MyEnum)Enum.Parse(typeof(MyEnum), "A,B");

结果是:e == Myenum.C

为什么中间有个逗号还不会报错呢?

我不做过多的测试,直接拿出.Net Reflector,定位到

mscorlib/CommonLanguageRuntimeLibrary/System/Enum/Parse(Type, string) : Object

[c-sharp] view plaincopy
  1. [ComVisible(true)]
  2. public static object Parse(Type enumType, string value)
  3. {
  4. return Parse(enumType, value, false);
  5. }

直接转到
public static object Parse(Type enumType, string value, bool ignoreCase);

下面就是我们要分析的代码

[c-sharp] view plaincopy
  1. [ComVisible(true)]
  2. public static object Parse(Type enumType, string value, bool ignoreCase)
  3. {
  4. if (enumType == null)
  5. {
  6. throw new ArgumentNullException("enumType");
  7. }
  8. if (!(enumType is RuntimeType))
  9. {
  10. throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), "enumType");
  11. }
  12. if (!enumType.IsEnum)
  13. {
  14. throw new ArgumentException(Environment.GetResourceString("Arg_MustBeEnum"), "enumType");
  15. }
  16. if (value == null)
  17. {
  18. throw new ArgumentNullException("value");
  19. }
  20. value = value.Trim();
  21. if (value.Length == 0)
  22. {
  23. throw new ArgumentException(Environment.GetResourceString("Arg_MustContainEnumInfo"));
  24. }
  25. //前面一堆参数检测,不管他
  26. //直接从这里看起
  27. ulong num = 0L;
  28. if ((char.IsDigit(value[0]) || (value[0] == '-')) || (value[0] == '+'))//这里判断value是不是
  29. 数字
  30. {
  31. Type underlyingType = GetUnderlyingType(enumType);
  32. try
  33. {
  34. //如果是数字,直接使用内部函数先获取类型,然后直接转换为相应的枚举类型,并返回结果
  35. object obj2 = Convert.ChangeType(value, underlyingType,
  36. CultureInfo.InvariantCulture);
  37. return ToObject(enumType, obj2);
  38. }
  39. catch (FormatException)
  40. {
  41. }
  42. }
  43. //如果不是数字,先把字符串分割
  44. string[] strArray = value.Split(enumSeperatorCharArray);
  45. HashEntry hashEntry = GetHashEntry(enumType);//获取相应的HashEntry
  46. string[] names = hashEntry.names;
  47. //下面是两个for,第一个是枚举分割后的字符,第二个是枚举Enum类型
  48. for (int i = 0; i < strArray.Length; i++)
  49. {
  50. strArray[i] = strArray[i].Trim();
  51. bool flag = false;
  52. for (int j = 0; j < names.Length; j++)
  53. {
  54. ulong num4;
  55. if (ignoreCase)
  56. {
  57. if (string.Compare(names[j], strArray[i], StringComparison.OrdinalIgnoreCase) ==
  58. 0)
  59. {
  60. goto Label_0122;
  61. }
  62. continue;
  63. }
  64. if (!names[j].Equals(strArray[i]))
  65. {
  66. continue;
  67. }
  68. //这里就是找到结果后的处理
  69. Label_0122:
  70. num4 = hashEntry.values[j];//获取当前的匹配的编号
  71. num |= num4;//与之前的编号进行按位或处理
  72. flag = true;
  73. break;
  74. }
  75. if (!flag)
  76. {
  77. throw new ArgumentException(string.Format(CultureInfo.CurrentCulture,
  78. Environment.GetResourceString("Arg_EnumValueNotFound"), new object[] { value }));
  79. }
  80. }
  81. //返回这个编号的Enum值
  82. return ToObject(enumType, num);
  83. }

现在可以知道,出现这样的结果就是因为这句话的作用
num |= num4;

把上面的测试稍作修改

[c-sharp] view plaincopy
  1. enum MyEnum
  2. {
  3. A,
  4. B,
  5. C,
  6. }

执行下面代码
MyEnum e = (MyEnum)Enum.Parse(typeof(MyEnum), "A,B");
结果是:e == Myenum.B

为什么会得出B就不用我说了吧!

转载于:https://www.cnblogs.com/samsonhuang/articles/2680629.html

Parse分析之 -- Enum.Parse相关推荐

  1. 学习笔记---取得枚举项的2种方法: Enum.GetValues()-Array.GetValue()和Enum.GetNames()-Enum.Parse()...

    代码 namespace EnumDemo { public enum Color { red = 0, orange =1, yellow =2, green=4, blue =5, cyan =6 ...

  2. 小心 Enum Parse 中的坑

    小心 Enum Parse 中的坑 Intro 最近使用枚举的时候,踩了一个小坑,分享一下,主要是枚举从 int 值转成枚举时可能会遇到 Sample 来看下面的示例: 首先定义一个枚举: publi ...

  3. python中urllib.parse啥意思_python-urllib.parse模块简述

    前言 小编最近在编写接口自动化测试用例的过程中,需要将get请求url中的部分参数替换成预设的数据,将url中的具有时效性的auth替换成auth生成方法返回值.经过一番调研,最后选取了python的 ...

  4. parse 日期_日期parse()方法以及JavaScript中的示例

    parse 日期 JavaScript Date parse()方法 (JavaScript Date parse() method) parse() method is a Date class m ...

  5. 一木.溪桥学爬虫-03:请求模块urllib、 urllib.request、urllib.parse.urlencode、urllib.parse.quote(str)、.unquote()

    一木.溪桥 在Logic Education跟Jerry学爬虫 07期:Python 爬虫 一木.溪桥学爬虫-03:请求模块urllib. urllib.request.urllib.parse.ur ...

  6. 利用Log parse 分析Exchange 性能并产生相应报表!(1)-Agent Log!

    这是一个基于微软官方的博客翻译的一个主题,最近发现了Log parse 这个工具真的不错,能够很方便的帮我们分析相关的问题.我们接下来的系列就是利用Log parse 工具来生成相应的报表或者分析出当 ...

  7. php中parse error,PHP异常Parse error: syntax error…错误解决方法

    在PHP中根本不需要使用var声明的,但是当一个变量作为一个类的成员变量的时候,使用var还是没有问题的 其实,这是一个非常容易解决掉的问题.在我看来,似曾相识,呵呵,最近学JavaScript可是学 ...

  8. python urllib.parse.quote_Python3的urllib.parse常用小结(urlencode,quote,quote_plu

    python2 与python3 导入urllib 时有差别 需要注意 按照标准, URL 只允许一部分 ASCII 字符(数字字母和部分符号),其他的字符(如汉字)是不符合 URL 标准的. 所以 ...

  9. Statspack专题

    eygle Statspack专题 :http://www.eygle.com/archives/2004/11/statspack_list.html 以下内容均在window Xp,oracle9 ...

  10. PLSQL_性能优化系列07_Oracle Parse Bind Variables解析绑定变量

    2014-09-25 Created By BaoXinjian 一.绑定变量用法和使用场合 使用绑定变量的重要性:如果不使用绑定变量而使用常量,会导致大量硬解析.由于硬解析的种种危害,不使用绑定变量 ...

最新文章

  1. 图神经网络(GNN)系列
  2. Tomcat安装及配置教程(超详细的图文教程)(亲测)
  3. Elasticsearch大文件搜索
  4. python监听键盘的库的名称_python实时监控键盘鼠标,pynput库的详细用法
  5. Emacs-24.2 中很重要的几个函数--实现自定义语法高亮的关键
  6. 什么是CSS+DIV及其优势所在?
  7. nodejs 使用的一些http网络请求模块
  8. C语言物流管理运输系统
  9. 内网中使用TeamViewer进行远程操作
  10. UWB是什么技术,主要的技术特点是什么?
  11. 实用网址(永久更新中)
  12. netty学习01--nio与oio的比较
  13. IOS 点击空白处隐藏键盘的几种方法
  14. windows命令行工具
  15. 送你个低代码福利,错过要再等一年
  16. Line营销机器人2019版
  17. Kafka 核心原理(贼全面)
  18. acer台式电脑怎么重装系统_宏基台式机装系统 手把手教你宏基台式机装系统方法...
  19. CentOS安装Elasticsearch_IK分词器拼音分词器_部署kibana_部署es集群
  20. Ardunio 完成STM32板子的串口通信

热门文章

  1. 【2019牛客暑期多校训练营(第七场)E】Find the median【权值线段树】
  2. java连接sftp的几种方式_Java使用SFTP和FTP两种连接服务器的方式实现对文件的上传下载...
  3. CamRaptor:针对DVR摄像头的漏洞利用工具
  4. DLLPasswordFilterImplant:DLL密码过滤器
  5. win7计算机自动关机设置在哪里设置方法,win7怎么设置自动关机【详细步骤】
  6. 【Luogu】重返现世
  7. 网易七鱼 Android 高性能日志写入方案
  8. 安卓Activity布局简述
  9. SQL Server 备份和还原
  10. [转]教你如何在博客园放“可运行代码