代码之家  ›  专栏  ›  技术社区  ›  Naveen

C中的字符串到枚举转换#

  •  38
  • Naveen  · 技术社区  · 15 年前

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

    Equals
    Not Equals 
    Less Than
    Greater Than
    

    请注意,这些字符串包含空格。我定义了一个枚举,它与以下条目匹配:

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

    因为空间是不允许的,所以我使用了uu字符。

    现在,是否有任何方法可以将给定的字符串自动转换为枚举元素,而不需要编写循环或一组if条件来满足我在c中的条件?

    7 回复  |  直到 9 年前
        1
  •  75
  •   Mehrdad Afshari    15 年前

    我建议建一个 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(' ', '_'));
    
        2
  •  20
  •   Richard Szalay    15 年前

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

    这一实施可以通过以下几种方式加以改进:

        3
  •  20
  •   Nick Strupat    9 年前
    Operation enumVal = (Operation)Enum.Parse(typeof(Operation), "Equals")
    

    对于“not equals”,obv需要在上面的语句中用下划线替换空格。

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

    string someInputText;
    var operation = (Operation)Enum.Parse(typeof(Operation), someInputText.Replace(" ", "_"));
    
        4
  •  10
  •   Samuel Carrijo    15 年前

    您可以使用parse方法:

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

    一些实例 here

        5
  •  1
  •   faceclean    15 年前

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

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

        6
  •  1
  •   VoidPointer    15 年前

    在C中,可以向枚举类型添加扩展方法。见 http://msdn.microsoft.com/en-us/library/bb383974.aspx

    可以使用此方法将ToString(operation op)、FromString(string str)和ToLocalizedString(operation op)方法添加到枚举类型中。用于查找特定字符串的方法取决于您的应用程序,并且应该与在类似情况下所做的一致。像其他人建议的那样使用字典似乎是一个很好的第一种方法,只要你不需要在你的应用程序中进行完整的本地化。

        7
  •  1
  •   arviman    10 年前

    我要一件这个 enum mapper class 它的执行速度比Enum.Parse快得多(它使用反射,而且速度非常慢)。 然后你可以使用 EnumFromString(typeof(YourEnum), "stringValue") 获取枚举。