Enum.Parse(),肯定是一个整洁的方式?

说我有一个枚举,

public enum Colours { Red, Blue } 

我可以看到parsing它们的唯一方法就是:

 string colour = "Green"; var col = (Colours)Enum.Parse(typeOf(Colours),colour); 

这将抛出System.ArgumentException,因为“绿色”不是“ Colours枚举的成员。

现在我真的讨厌try / catch中的包装代码,有没有更好的方法来做到这一点,不涉及我遍历每个Colours枚举,并做一个string与colour比较?

首先使用Enum.IsDefined() ,以避免在try / catch中打包。 它将返回一个布尔值是否input是该枚举的有效成员。

我相信4.0有Enum.TryParse

否则使用扩展方法 :

 public static bool TryParse<T>(this Enum theEnum, string valueToParse, out T returnValue) { returnValue = default(T); int intEnumValue; if (Int32.TryParse(valueToParse, out intEnumValue)) { if (Enum.IsDefined(typeof(T), intEnumValue)) { returnValue = (T)(object)intEnumValue; return true; } } return false; } 

不,对于这个(其他类有一个TryParse),没有“无抛”的方法。

但是,您可以轻松编写自己的代码,以便将try-catch逻辑(或IsDefined检查)封装在一个辅助方法中,以免污染您的应用程序代码:

 public static object TryParse(Type enumType, string value, out bool success) { success = Enum.IsDefined(enumType, value); if (success) { return Enum.Parse(enumType, value); } return null; } 

如果我parsing一个“ 可信 ”的枚举,那么我使用Enum.Parse()。
我的意思是,我知道这将永远是一个有效的枚举,而且永远不会出错!

但有些时候,“ 你永远不知道你会得到什么 ”,在那些时候,你需要使用一个可为空的返回值。 由于.net不提供这个烘烤,你可以推出自己的。 这是我的食谱:

 public static TEnum? ParseEnum<TEnum>(string sEnumValue) where TEnum : struct { TEnum eTemp; TEnum? eReturn = null; if (Enum.TryParse<TEnum>(sEnumValue, out eTemp) == true) eReturn = eTemp; return eReturn; } 

要使用这个方法,就像这样调用它:

 eColor? SelectedColor = ParseEnum<eColor>("Red"); 

只需将此方法添加到您用来存储其他常用实用程序function的类中即可。

只是为了扩大天空链接到.net 4 Enum.TryParse <> ,即

 Enum.TryParse<TEnum>( string value, [bool ignoreCase,] out TEnum result ) 

这可以使用如下:

  enum Colour { Red, Blue } private void ParseColours() { Colour aColour; // IMO using the actual enum type is intuitive, but Resharper gives // "Access to a static member of a type via a derived type" if (Colour.TryParse("RED", true, out aColour)) { // ... success } // OR, the compiler can infer the type from the out if (Enum.TryParse("Red", out aColour)) { // ... success } // OR explicit type specification // (Resharper: Type argument specification is redundant) if (Enum.TryParse<Colour>("Red", out aColour)) { // ... success } }