¿Cómo convertir un enumeración entre (cadena, lista de banderas, enumina con banderas)? -- # campo con parsing campo con enums camp Relacionados El problema

How do I convert an enum between (string, list of flags, enum with flags)?


6
vote

problema

Español

¿Cómo convertirme de enumias a cadenas y viceversa?

y tomando el caso de que los enumeran pueden contener múltiples banderas, ¿cómo puedo obtener una lista de todas las banderas y contiene un enumeración?

Original en ingles

How do I convert from enums to strings and vice versa?

And taking the case that enums can contain multiple flags, how can I get a list of all the flags an enum contains?

        
       
       

Lista de respuestas

14
 
vote
vote
La mejor respuesta
 

Actualización 2

Hay una biblioteca que implementa la mayor parte de la funcionalidad que necesitaría de Enums, con un mejor rendimiento https://github.com/tylerbrinkley/enums.net


de enum to string: [Enum Instance].ToString();

Ejemplo: using System.Windows.Input;

  ModifierKeys mk = ModifierKeys.None | ModifierKeys.Alt | ModifierKeys.Shift | ModifierKeys.Control; mk.Tostring();   

Devoluciones:

Alt, Control, Shift Nota: "Ninguno", la bandera se quitó


de la cadena a enum:

Enum.TryParse([(string) value],out [store variable]);
O
Enum.Parse(typeof([Enum Type]), [(string) value], [(bool) should ignore character case ?]);

Ejemplo: using System.Windows.Input;

  // Way 1: ModifierKeys outenum; bool successful = Enum.TryParse("None,Alt,Control,Shift", out outenum);  Console.WriteLine($"Is Successful ? : {successful}, result : {outenum.ToString()}");   

Resultado: Is Successful ? : True, result : Alt, Control, Shift

o

  // Way 2: ModifierKeys outenum = (ModifierKeys)Enum.Parse(typeof(ModifierKeys), "None,Alt,Control,Shift", true); Console.WriteLine(outenum.ToString());   

Resultado: using System.Windows.Input;0


de las banderas de Enum para LISTA

Ejemplo:

  using System.Windows.Input;111  

Resultado: using System.Windows.Input;2


de la lista de banderas de enumio a Enum

Ejemplo:

  using System.Windows.Input;3  

Resultado: using System.Windows.Input;4


de la lista de cadena a enum

Ejemplo:

  using System.Windows.Input;5  

Resultado: using System.Windows.Input;6


Notas generales:

  • usando la forma 1 Cuando se prefiere la conversión de la cadena a enum, porque si la forma en que falla la forma 2, se despide una excepción, pero si la forma 1 falla, vuelve FALSO
  • Al separar las banderas de Enume mientras analizan la cadena de enumeración, use el separador using System.Windows.Input;717
  • Tener espacios entre las banderas en la cadena de Enum no lo importará, por lo que using System.Windows.Input;8 = using System.Windows.Input;9

Actualización 1:

Escribí una clase simple genérica enumconverter que le ahorra tiempo

  ModifierKeys mk = ModifierKeys.None | ModifierKeys.Alt | ModifierKeys.Shift | ModifierKeys.Control; mk.Tostring(); 0  

Uso:

  ModifierKeys mk = ModifierKeys.None | ModifierKeys.Alt | ModifierKeys.Shift | ModifierKeys.Control; mk.Tostring(); 1  
 

Update 2

there is a library that implements most of the functionality you would need from enums, with better performance https://github.com/TylerBrinkley/Enums.NET


From Enum To String: [Enum Instance].ToString();

Example: using System.Windows.Input;

ModifierKeys mk = ModifierKeys.None | ModifierKeys.Alt | ModifierKeys.Shift | ModifierKeys.Control; mk.Tostring(); 

returns:

Alt, Control, Shift Note: "None" flag got removed


From string to Enum:

Enum.TryParse([(string) value],out [store variable]);
OR
Enum.Parse(typeof([Enum Type]), [(string) value], [(bool) should ignore character case ?]);

Example: using System.Windows.Input;

// Way 1: ModifierKeys outenum; bool successful = Enum.TryParse("None,Alt,Control,Shift", out outenum);  Console.WriteLine($"Is Successful ? : {successful}, result : {outenum.ToString()}"); 

Result: Is Successful ? : True, result : Alt, Control, Shift

OR

// Way 2: ModifierKeys outenum = (ModifierKeys)Enum.Parse(typeof(ModifierKeys), "None,Alt,Control,Shift", true); Console.WriteLine(outenum.ToString()); 

Result: Alt, Control, Shift


From Enum Flags to List

Example:

        ModifierKeys mk = ModifierKeys.None | ModifierKeys.Alt | ModifierKeys.Shift | ModifierKeys.Control;         List<ModifierKeys> mklist =             mk             .ToString() // Convert the enum to string             .Split(new[] { "," } , StringSplitOptions.RemoveEmptyEntries) // Converts the string to Enumerable of string             .Select(//converts each element of the list to an enum, and makes an Enumerable out of the newly-converted items                 strenum =>                 {                     ModifierKeys outenum;                     Enum.TryParse(strenum , out outenum);                     return outenum;                 })             .ToList(); // Creates a List from the Enumerable 

Result: {ModifierKeys.Alt , ModifierKeys.Shift , ModifierKeys.Control}


From List of enum flags to enum

Example:

 ModifierKeys[] mk = {ModifierKeys.None, ModifierKeys.Alt, ModifierKeys.Control, ModifierKeys.Shift};  ModifierKeys mkc = mk.Aggregate((prev, next) => prev | next);  Console.WriteLine(mkc.ToString()); 

Result: Alt, Control, Shift


From List of string to enum

Example:

    string[] mk = {"None", "Alt", "Control", "Shift"};     ModifierKeys mkc = mk.Select(x => {ModifierKeys outenum; Enum.TryParse(x, out outenum); return outenum;}).Aggregate((prev , next) => prev | next);     Console.WriteLine(mkc.ToString()); 

Result: Alt, Control, Shift


General notes:

  • Using way 1 when converting from string to Enum is preferred, because if way 2 fails it throws an exception, but if way 1 fails it returns false
  • When separating enum flags while parsing enum string, use the , separator only
  • Having spaces between flags in enum string won't matter, so "None , Alt,Control, Shift" = "None,Alt,Control,Shift"

UPDATE 1 :

I wrote a simple Generic EnumConverter class that saves you time

public class EnumConverter<T> where T : struct, IConvertible, IFormattable {     private Type EnumType { get; set; }      public Type UnderlyingType     {         get         {             return Enum.GetUnderlyingType(EnumType);         }     }     public EnumConverter()     {         if (typeof(T).IsEnum)             EnumType = typeof(T);         else             throw new ArgumentException("Provided type must be an enum");     }     public IEnumerable<T> ToFlagsList(T FromSingleEnum)     {         return FromSingleEnum.ToString()         .Split(new[] { "," } , StringSplitOptions.RemoveEmptyEntries)         .Select(             strenum =>             {                 T outenum = default(T);                 Enum.TryParse(strenum , true , out outenum);                 return outenum;             });     }     public IEnumerable<T> ToFlagsList(IEnumerable<string> FromStringEnumList)     {         return FromStringEnumList         .Select(             strenum =>             {                 T outenum = default(T);                 Enum.TryParse(strenum , true , out outenum);                 return outenum;             });     }      public T ToEnum(string FromString)     {         T outenum = default(T);         Enum.TryParse(FromString , true , out outenum);         return outenum;     }     public T ToEnum(IEnumerable<T> FromListOfEnums)     {         var provider = new NumberFormatInfo();         var intlist = FromListOfEnums.Select(x => x.ToInt32(provider));         var aggregatedint = intlist.Aggregate((prev , next) => prev | next);         return (T)Enum.ToObject(EnumType , aggregatedint);     }     public T ToEnum(IEnumerable<string> FromListOfString)     {         var enumlist = FromListOfString.Select(x =>         {             T outenum = default(T);             Enum.TryParse(x , true , out outenum);             return outenum;         });         return ToEnum(enumlist);     }      public string ToString(T FromEnum)     {         return FromEnum.ToString();     }     public string ToString(IEnumerable<T> FromFlagsList)     {         return ToString(ToEnum(FromFlagsList));     }      public object ToUnderlyingType(T FromeEnum)     {         return Convert.ChangeType(FromeEnum , UnderlyingType);     } } 

Usage :

 EnumConverter<ModifierKeys> conv = new EnumConverter<ModifierKeys>();  //conv.ToEnum  //conv.ToFlagsList  //conv.ToString 
 
 

Relacionados problema

2  Usando enum con variables de cadena  ( Using enum with string variables ) 
Estoy tratando de hacer algo así, enum Data_Property { NAME, DATETIME, TYPE, }; struct Item_properties { char* Name; char* DateTime; int Type; ...

44  ¿Qué TIPSFE ENUM EN C ++ estás usando?  ( Which typesafe enum in c are you using ) 
Es un conocimiento común que los enumnos incorporados en C ++ no son TIPSAFE. Me preguntaba qué clases que implementan Typesfe Enums se usan allí ... Yo mismo...

34  Poblar Swing Jcombobox de Enum  ( Populating swing jcombobox from enum ) 
Me gustaría rellenar un java.swing JComboBox con valores de un Enum . e.g. public enum Mood { HAPPY, SAD, AWESOME; } y Haga que estos tres valores...

3  ¿Cómo enviar una colección de enumeres a un servicio WCF?  ( How do send a collection of enums to a wcf service ) 
Tengo problemas para enviar una colección de enumias a un método de servicio WCF. Utilicé esta publicación como guía: compartiendo enumul con el servicio WCF...

89  ¿Manera fácil de usar variables de tipos de enume como cadena en C?  ( Easy way to use variables of enum types as string in c ) 
Esto es lo que estoy tratando de hacer: typedef enum { ONE, TWO, THREE } Numbers; Estoy tratando de escribir una función que haría un caso de conmutaci...

0  Manera más limpia de lanzar un C # enum  ( Cleaner way to cast a c sharp enum ) 
Quiero usar un objeto (devuelto por el marco, no en mi control), myField que tiene una propiedad DisplayFormat de Type Enum collection.find({}, n...

2  ¿Cómo lanzar a CRTP en Java?  ( How to cast to crtp in java ) 
Tengo un caso bastante simple donde hago alguna asignación genérica básica: final Detail detail = field.getAnnotation(Detail.class); final String example =...

1  ¿Qué es una buena alternativa a los espacios de nombres dentro de las clases?  ( What is a good alternative to namespaces within classes ) 
El problema es que C ++ no permite las declaraciones de espacio de nombres dentro de las clases. (Busqué en Internet y encontré esto; Si no es cierto, por fav...

9  ¿Usando la declaración con Enum?  ( Using declaration with enum ) 
El uso de la Declaración no parece funcionar con Enum Type class Sample{ public: enum Colour { RED,BLUE,GREEN}; } using Sample::Colour; no funciona !!...

47  Diferencia entre enumentar y definir declaraciones  ( Difference between enum and define statements ) 
¿Cuál es la diferencia entre usar una declaración definida y una declaración de enumeración en C / C ++ (y hay alguna diferencia cuando los use con C o C ++)?...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos