2009-07-27 156 views
32

我有我在哪里显示像一些条目的组合框:字符串转换枚举在C#中

Equals 
Not Equals 
Less Than 
Greater Than 

注意,这些字符串包含空格。我有一个枚举定义匹配这些条目,如:

enum Operation{Equals, Not_Equals, Less_Than, Greater_Than}; 

由于空间不允许,我用_字符。

现在,有没有办法将给定的字符串自动转换为枚举元素,而无需编写一个循环或一组if条件我自己在C#中?

+0

强相关:[如何设置空间上枚举](http://stackoverflow.com/questions/1101872/how-to-set-space-on-enum) – nawfal 2013-06-09 12:11:49

+1

除了字典方法,您可以使用属性将元数据(如显示字符串)与枚举相关联。看看[C#枚举的来龙去脉](http://www.codeducky.org/ins-outs-c-enums/)。 – ChaseMedallion 2014-07-20 20:14:40

回答

67

我建议构建Dictionary<string, Operation>将友好名称映射为enum常量,并在元素本身中使用正常的命名约定。

enum Operation{ Equals, NotEquals, LessThan, GreaterThan }; 

var dict = new Dictionary<string, Operation> { 
    { "Equals", Operation.Equals }, 
    { "Not Equals", Operation.NotEquals }, 
    { "Less Than", Operation.LessThan }, 
    { "Greater Than", Operation.GreaterThan } 
}; 

var op = dict[str]; 

或者,如果你要坚持你目前的方法,你可以做(​​我建议不要做):

var op = (Operation)Enum.Parse(typeof(Operation), str.Replace(' ', '_')); 
+1

出于兴趣,你为什么不推荐使用Enum.Parse?更多转换? – Pondidum 2009-07-27 08:50:19

+15

我不反对`Enum.Parse`方法。我反对将用户界面字符串紧密耦合到代码元素(并根据显示名称更改代码)。 – 2009-07-27 09:06:51

18

无论是创建一个使用字典的专用映射器(每迈赫达德的答案)或实施TypeConverter

您的自定义TypeConverter可以替换" " -> "_"(反之亦然),或者它可以反映枚举并使用属性来确定项目的显示文本。

enum Operation 
{ 
    [DisplayName("Equals")] 
    Equals, 

    [DisplayName("Not Equals")] 
    Not_Equals, 

    [DisplayName("Less Than")] 
    Less_Than, 

    [DisplayName("Greater Than")] 
    Greater_Than 
}; 

public class OperationTypeConverter : TypeConverter 
{ 
    private static Dictionary<string, Operation> operationMap; 

    static OperationTypeConverter() 
    { 
     BindingFlags bindingFlags = BindingFlags.Static | BindingFlags.GetField 
      | BindingFlags.Public; 

     operationMap = enumType.GetFields(bindingFlags).ToDictionary(
      c => GetDisplayName(c) 
      ); 
    } 

    private static string GetDisplayName(FieldInfo field, Type enumType) 
    { 
     DisplayNameAttribute attr = (DisplayNameAttribute)Attribute.GetCustomAttribute(typeof(DisplayNameAttribute)); 

     return (attr != null) ? attr.DisplayName : field.Name; 
    } 

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     string stringValue = value as string; 

     if (stringValue != null) 
     { 
      Operation operation; 
      if (operationMap.TryGetValue(stringValue, out operation)) 
      { 
       return operation; 
      } 
      else 
      { 
       throw new ArgumentException("Cannot convert '" + stringValue + "' to Operation"); 
      } 
     } 
    } 
} 

这实现可以在几个方面进行改进:

19
Operation enumVal = (Operation)Enum.Parse(typeof(Operation), "Equals") 

对于 “不等于”,你obv需要r E放置空间用下划线在上述声明

编辑:

string someInputText; 
var operation = (Operation)Enum.Parse(typeof(Operation), someInputText.Replace(" ", "_")); 
9

您可以使用Parse方法:

Operarion operation = (Operation)Enum.Parse(typeof(Operation), "Not_Equals"); 

一些例子以下版本试图解析之前替换下划线空间here

0

为什么要用另一种方式:将Enumeration转换为String?

只需从您的枚举中生成组合框的项目即可。

0

在C#中,您可以将扩展方法添加到枚举类型。请参阅 http://msdn.microsoft.com/en-us/library/bb383974.aspx

您可以使用此方法将toString(Operation op),fromString(String str)和toLocalizedString(Operation op)方法添加到您的枚举类型中。您用于查找特定字符串的方法取决于您的应用程序,并且应与您在类似情况下执行的操作一致。只要你不需要在你的应用程序中完全本地化,使用字典作为其他人建议似乎是一个很好的第一种方法。

0

我会用这个enum mapper class的单例执行速度比Enum.Parse快(它使用反射并且非常慢)。 然后,您可以使用EnumFromString(typeof(YourEnum), "stringValue")来获取您的枚举。