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就不用我说了吧!