C#中枚举转换的字符串

Nav*_*een 39 c# enums

我有一个组合框,我在其中显示一些条目,如:

Equals
Not Equals 
Less Than
Greater Than
Run Code Online (Sandbox Code Playgroud)

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

enum Operation{Equals, Not_Equals, Less_Than, Greater_Than};
Run Code Online (Sandbox Code Playgroud)

由于不允许空间,我使用了_字符.

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

Meh*_*ari 78

我建议构建一个Dictionary<string, Operation>将友好名称映射到枚举常量并在元素本身中使用常规命名约定.

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]; 
Run Code Online (Sandbox Code Playgroud)

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

var op = (Operation)Enum.Parse(typeof(Operation), str.Replace(' ', '_'));
Run Code Online (Sandbox Code Playgroud)

  • 我不反对'Enum.Parse`方法.我反对将用户界面字符串紧密耦合到代码元素(并根据显示名称更改代码). (18认同)
  • 出于兴趣,为什么建议不要使用Enum.Parse?更多转换? (2认同)

Ric*_*lay 20

使用字典创建专用映射器(根据Mehrdad的答案)或实现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");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

可以通过以下几种方式改进此实施:

  • 此外,您似乎无法在枚举声明中使用DisplayName属性 (4认同)

Ada*_*Dev 20

Operation enumVal = (Operation)Enum.Parse(typeof(Operation), "Equals")
Run Code Online (Sandbox Code Playgroud)

对于"Not Equals",您需要在上面的语句中用下划线替换空格

编辑:以下版本在尝试解析之前用下划线替换空格:

string someInputText;
var operation = (Operation)Enum.Parse(typeof(Operation), someInputText.Replace(" ", "_"));
Run Code Online (Sandbox Code Playgroud)


Sam*_*ijo 10

您可以使用Parse方法:

 Operarion operation = (Operation)Enum.Parse(typeof(Operation), "Not_Equals");
Run Code Online (Sandbox Code Playgroud)

这里有一些例子