Parse分析之 -- Enum.Parse
原文地址:http://blog.csdn.net/aimeast/article/details/4516323
先看一个例子:
- enum MyEnum
- {
- A = 1,
- B = 2,
- C = 3,
- }
执行下面代码
- MyEnum e = (MyEnum)Enum.Parse(typeof(MyEnum), "A,B");
结果是:e == Myenum.C
为什么中间有个逗号还不会报错呢?
我不做过多的测试,直接拿出.Net Reflector,定位到
mscorlib/CommonLanguageRuntimeLibrary/System/Enum/Parse(Type, string) : Object
- [ComVisible(true)]
- public static object Parse(Type enumType, string value)
- {
- return Parse(enumType, value, false);
- }
直接转到
public static object Parse(Type enumType, string value, bool ignoreCase);
下面就是我们要分析的代码
- [ComVisible(true)]
- public static object Parse(Type enumType, string value, bool ignoreCase)
- {
- if (enumType == null)
- {
- throw new ArgumentNullException("enumType");
- }
- if (!(enumType is RuntimeType))
- {
- throw new ArgumentException(Environment.GetResourceString("Arg_MustBeType"), "enumType");
- }
- if (!enumType.IsEnum)
- {
- throw new ArgumentException(Environment.GetResourceString("Arg_MustBeEnum"), "enumType");
- }
- if (value == null)
- {
- throw new ArgumentNullException("value");
- }
- value = value.Trim();
- if (value.Length == 0)
- {
- throw new ArgumentException(Environment.GetResourceString("Arg_MustContainEnumInfo"));
- }
- //前面一堆参数检测,不管他
- //直接从这里看起
- ulong num = 0L;
- if ((char.IsDigit(value[0]) || (value[0] == '-')) || (value[0] == '+'))//这里判断value是不是
- 数字
- {
- Type underlyingType = GetUnderlyingType(enumType);
- try
- {
- //如果是数字,直接使用内部函数先获取类型,然后直接转换为相应的枚举类型,并返回结果
- object obj2 = Convert.ChangeType(value, underlyingType,
- CultureInfo.InvariantCulture);
- return ToObject(enumType, obj2);
- }
- catch (FormatException)
- {
- }
- }
- //如果不是数字,先把字符串分割
- string[] strArray = value.Split(enumSeperatorCharArray);
- HashEntry hashEntry = GetHashEntry(enumType);//获取相应的HashEntry
- string[] names = hashEntry.names;
- //下面是两个for,第一个是枚举分割后的字符,第二个是枚举Enum类型
- for (int i = 0; i < strArray.Length; i++)
- {
- strArray[i] = strArray[i].Trim();
- bool flag = false;
- for (int j = 0; j < names.Length; j++)
- {
- ulong num4;
- if (ignoreCase)
- {
- if (string.Compare(names[j], strArray[i], StringComparison.OrdinalIgnoreCase) ==
- 0)
- {
- goto Label_0122;
- }
- continue;
- }
- if (!names[j].Equals(strArray[i]))
- {
- continue;
- }
- //这里就是找到结果后的处理
- Label_0122:
- num4 = hashEntry.values[j];//获取当前的匹配的编号
- num |= num4;//与之前的编号进行按位或处理
- flag = true;
- break;
- }
- if (!flag)
- {
- throw new ArgumentException(string.Format(CultureInfo.CurrentCulture,
- Environment.GetResourceString("Arg_EnumValueNotFound"), new object[] { value }));
- }
- }
- //返回这个编号的Enum值
- return ToObject(enumType, num);
- }
现在可以知道,出现这样的结果就是因为这句话的作用
num |= num4;
把上面的测试稍作修改
- enum MyEnum
- {
- A,
- B,
- C,
- }
执行下面代码
MyEnum e = (MyEnum)Enum.Parse(typeof(MyEnum), "A,B");
结果是:e == Myenum.B
为什么会得出B就不用我说了吧!
转载于:https://www.cnblogs.com/samsonhuang/articles/2680629.html
Parse分析之 -- Enum.Parse相关推荐
- 学习笔记---取得枚举项的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 ...
- 小心 Enum Parse 中的坑
小心 Enum Parse 中的坑 Intro 最近使用枚举的时候,踩了一个小坑,分享一下,主要是枚举从 int 值转成枚举时可能会遇到 Sample 来看下面的示例: 首先定义一个枚举: publi ...
- python中urllib.parse啥意思_python-urllib.parse模块简述
前言 小编最近在编写接口自动化测试用例的过程中,需要将get请求url中的部分参数替换成预设的数据,将url中的具有时效性的auth替换成auth生成方法返回值.经过一番调研,最后选取了python的 ...
- parse 日期_日期parse()方法以及JavaScript中的示例
parse 日期 JavaScript Date parse()方法 (JavaScript Date parse() method) parse() method is a Date class m ...
- 一木.溪桥学爬虫-03:请求模块urllib、 urllib.request、urllib.parse.urlencode、urllib.parse.quote(str)、.unquote()
一木.溪桥 在Logic Education跟Jerry学爬虫 07期:Python 爬虫 一木.溪桥学爬虫-03:请求模块urllib. urllib.request.urllib.parse.ur ...
- 利用Log parse 分析Exchange 性能并产生相应报表!(1)-Agent Log!
这是一个基于微软官方的博客翻译的一个主题,最近发现了Log parse 这个工具真的不错,能够很方便的帮我们分析相关的问题.我们接下来的系列就是利用Log parse 工具来生成相应的报表或者分析出当 ...
- php中parse error,PHP异常Parse error: syntax error…错误解决方法
在PHP中根本不需要使用var声明的,但是当一个变量作为一个类的成员变量的时候,使用var还是没有问题的 其实,这是一个非常容易解决掉的问题.在我看来,似曾相识,呵呵,最近学JavaScript可是学 ...
- python urllib.parse.quote_Python3的urllib.parse常用小结(urlencode,quote,quote_plu
python2 与python3 导入urllib 时有差别 需要注意 按照标准, URL 只允许一部分 ASCII 字符(数字字母和部分符号),其他的字符(如汉字)是不符合 URL 标准的. 所以 ...
- Statspack专题
eygle Statspack专题 :http://www.eygle.com/archives/2004/11/statspack_list.html 以下内容均在window Xp,oracle9 ...
- PLSQL_性能优化系列07_Oracle Parse Bind Variables解析绑定变量
2014-09-25 Created By BaoXinjian 一.绑定变量用法和使用场合 使用绑定变量的重要性:如果不使用绑定变量而使用常量,会导致大量硬解析.由于硬解析的种种危害,不使用绑定变量 ...
最新文章
- 图神经网络(GNN)系列
- Tomcat安装及配置教程(超详细的图文教程)(亲测)
- Elasticsearch大文件搜索
- python监听键盘的库的名称_python实时监控键盘鼠标,pynput库的详细用法
- Emacs-24.2 中很重要的几个函数--实现自定义语法高亮的关键
- 什么是CSS+DIV及其优势所在?
- nodejs 使用的一些http网络请求模块
- C语言物流管理运输系统
- 内网中使用TeamViewer进行远程操作
- UWB是什么技术,主要的技术特点是什么?
- 实用网址(永久更新中)
- netty学习01--nio与oio的比较
- IOS 点击空白处隐藏键盘的几种方法
- windows命令行工具
- 送你个低代码福利,错过要再等一年
- Line营销机器人2019版
- Kafka 核心原理(贼全面)
- acer台式电脑怎么重装系统_宏基台式机装系统 手把手教你宏基台式机装系统方法...
- CentOS安装Elasticsearch_IK分词器拼音分词器_部署kibana_部署es集群
- Ardunio 完成STM32板子的串口通信
热门文章
- 【2019牛客暑期多校训练营(第七场)E】Find the median【权值线段树】
- java连接sftp的几种方式_Java使用SFTP和FTP两种连接服务器的方式实现对文件的上传下载...
- CamRaptor:针对DVR摄像头的漏洞利用工具
- DLLPasswordFilterImplant:DLL密码过滤器
- win7计算机自动关机设置在哪里设置方法,win7怎么设置自动关机【详细步骤】
- 【Luogu】重返现世
- 网易七鱼 Android 高性能日志写入方案
- 安卓Activity布局简述
- SQL Server 备份和还原
- [转]教你如何在博客园放“可运行代码