繁体   English   中英

C#中枚举转换的字符串

[英]String to enum conversion in C#

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

Equals
Not Equals 
Less Than
Greater Than

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

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

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

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

我建议构建一个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]; 

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

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

使用字典创建专用映射器(根据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");
            }
        }
    }
}

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

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

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

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

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

您可以使用Parse方法:

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

这里有一些例子

为什么使用另一种方式:将枚举转换为字符串?

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

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

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

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

从C#8开始,你可以使用开关来做到这一点。 在您的示例中,我相信代码将是这样的。

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

public static string OperationString(Operation opString) =>
    opString switch
    {
        Operation.Equals => "Equals",
        Operation.Not_Equals => "Not Equals",
        Operation.Less_Than=> "Less Than",
        Operation.Greater_Than=> "Greater Than",
        _   => throw new ArgumentException(message: "invalid enum value", paramName: nameof(opString )),
    };

请参阅此处获取文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM