快捷搜索:

Parse分析之 -- Enum.Parse

先看一个例子:

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 num |= num4;

把上面的测试稍作改动

enum MyEnum

{

A,

B,

C,

}

履行下面代码

MyEnum e = (MyEnum)Enum.Parse(typeof(MyEnum), "A,B");

结果是:e == Myenum.B

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

转自:http://blog.csdn.net/aimeast/archive/2009/09/03/4516323.aspx

您可能还会对下面的文章感兴趣: