Tengo una enumeración:

public enum MyColours
{
    Red,
    Green,
    Blue,
    Yellow,
    Fuchsia,
    Aqua,
    Orange
}

y tengo una cadena:

string colour = "Red";

Quiero ser capaz de volver:

MyColours.Red

de:

public MyColours GetColour(string colour)

Tengo hasta ahora:

public MyColours GetColours(string colour)
{
    string[] colours = Enum.GetNames(typeof(MyColours));
    int[]    values  = Enum.GetValues(typeof(MyColours));
    int i;
    for(int i = 0; i < colours.Length; i++)
    {
        if(colour.Equals(colours[i], StringComparison.Ordinal)
            break;
    }
    int value = values[i];
    //I know all the information about the matched enumeration
    //but how do i convert this information into returning a
    //MyColour enumeration?
}

Como se puede ver, estoy un poco atascado. Existe de todos modos para seleccionar un enumerador por valor. Algo así como:

MyColour(2) 

resultaría en

MyColour.Green

12 Comentarios

  1. 355

    salida del Sistema.Enum.Parse:

    
    enum Colors {Red, Green, Blue}
    
    //your code:
    Colors color = (Colors)System.Enum.Parse(typeof(Colors), "Green");
     
    
    • No olvide que usted puede tener que ignorar mayúsculas y minúsculas pasando en un tercer parámetro opcional «true»
    • Exactamente lo que estaba buscando ! Saludos !
    • Es una lástima que no hay Enum.TryParse…
    • En realidad, no es una Enumeración.TryParse.
  2. 18

    Se puede convertir el tipo int para una enumeración

    (MyColour)2

    También existe la opción de Enum.Analizar

    (MyColour)Enum.Parse(typeof(MyColour), "Red")
  3. 10

    Dado el último y el mayor de los cambios .NETO (+ Core) y C# 7, aquí es la mejor solución:

    var ignoreCase = true;
    Enum.TryParse("red", ignoreCase , out MyColours colour);

    de color variable puede ser usada en el ámbito de Enum.TryParse

  4. 2

    He marcado OregonGhost la respuesta de +1, entonces traté de usar la iteración y se dio cuenta de que no estaba del todo bien porque Enum.GetNames devuelve cadenas. Desea Enum.GetValues:

    public MyColours GetColours(string colour)
    {  
       foreach (MyColours mc in Enum.GetValues(typeof(MyColours))) 
       if (mc.ToString() == surveySystem) 
          return mc;
    
       return MyColors.Default;
    }
  5. 1

    Puede utilizar Enum.Parse para obtener un valor de enumeración del nombre. Se puede iterar sobre todos los valores con Enum.GetNames, y sólo se puede emitir un int a un enum para obtener el valor de enumeración de la int valor.

    Como este, por ejemplo:

    public MyColours GetColours(string colour)
    {
        foreach (MyColours mc in Enum.GetNames(typeof(MyColours))) {
            if (mc.ToString().Contains(colour)) {
                return mc;
            }
        }
        return MyColours.Red; //Default value
    }

    o:

    public MyColours GetColours(string colour)
    {
        return (MyColours)Enum.Parse(typeof(MyColours), colour, true); //true = ignoreCase
    }

    El último lanzará una excepción ArgumentException si el valor no se encuentra, usted puede querer atraparlo dentro de la función y devolver el valor predeterminado.

    • NOTA: debe haber sido Enum.GetValues, por supuesto, como se muestra en el Colin de la respuesta.
  6. 0

    Como se menciona en las respuestas anteriores, usted puede lanzar directamente a la base del tipo de dato (int -> tipo enum) o parse (string -> tipo enum).

    pero tenga cuidado – no hay ninguna .TryParse para las enumeraciones, por lo que TENDRÁ un bloque try/catch todo el análisis para la captura de los errores.

  7. 0

    También puede ser que desee comprobar hacia fuera algunas de las sugerencias en este blog:
    Mi nuevo amigo, Enum<T>

    El post se describe una forma de crear un simple genérico de la clase auxiliar que permite evitar el feo de fundición sintaxis inherente con Enum.Parse – en cambio usted termina de escribir algo como esto en tu código:

    MyColours colour = Enum<MyColours>.Parse(stringValue); 

    O echa un vistazo a algunos de los comentarios en el mismo post que hable sobre el uso de un método de extensión para alcanzar similares.

    • El puesto de enlace está roto.
  8. 0
    class EnumStringToInt //to search for a string in enum
    {
        enum Numbers{one,two,hree};
        static void Main()
        {
            Numbers num = Numbers.one; //converting enum to string
            string str = num.ToString();
            //Console.WriteLine(str);
            string str1 = "four";
            string[] getnames = (string[])Enum.GetNames(typeof(Numbers));
            int[] getnum = (int[])Enum.GetValues(typeof(Numbers));
            try
            {
                for (int i = 0; i <= getnum.Length; i++)
                {
                    if (str1.Equals(getnames[i]))
                    {
                        Numbers num1 = (Numbers)Enum.Parse(typeof(Numbers), str1);
                        Console.WriteLine("string found:{0}", num1);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Value not found!", ex);
            }
        }
    }
    • C# se ha construido en la funcionalidad de este.
    • ¿cómo es esto una respuesta a la pregunta? mira las otras respuestas de manera mucho más fácil de código
  9. 0

    Una cosa que puede ser útil (además de la ya vigente o bien respuestas proporcionadas por el momento) es el StringEnum idea siempre aquí

    Con esto usted puede definir sus enumeraciones como clases (los ejemplos son en vb.net):

    < StringEnumRegisteredOnly(), DebuggerStepThrough(),
    ImmutableObject(True)> Public NotInheritable Clase
    eAuthenticationMethod Hereda StringEnumBase(De
    eAuthenticationMethod)

    Private Sub New(ByVal StrValue As String)
      MyBase.New(StrValue)   
    End Sub
    
    < Description("Use User Password Authentication")> Public Shared ReadOnly UsernamePassword As New eAuthenticationMethod("UP")   
    
    < Description("Use Windows Authentication")> Public Shared ReadOnly WindowsAuthentication As New eAuthenticationMethod("W")   

    Final De La Clase

    Y ahora usted podría usar esta clase como lo haría uso de una enumeración: eAuthenticationMethod.WindowsAuthentication y esto sería, esencialmente, como la asignación de la ‘W‘ el valor lógico de WindowsAuthentication (dentro de la enumeración) y si se va a ver este valor desde una ventana de propiedades (o algo más que utiliza el Sistema.ComponentModel.Descripción de la propiedad), que obtendría «Utilizar la Autenticación de Windows«.

    He estado usando esto por un largo tiempo ahora y hace que el código sea más claro en la intención.

  10. 0
    (MyColours)Enum.Parse(typeof(MyColours), "red", true); //MyColours.Red
    (int)((MyColours)Enum.Parse(typeof(MyColours), "red", true)); //0
  11. -1
    var color =  Enum.Parse<Colors>("Green");
    • Esto ni siquiera compilar. No hay genéricos Parse método.

Dejar respuesta

Please enter your comment!
Please enter your name here