Tengo una enumeración:
public enum MyColours
{
Red,
Green,
Blue,
Yellow,
Fuchsia,
Aqua,
Orange
}
y tengo una cadena:
string colour = "Red";
Quiero poder volver:
MyColours.Red
de:
public MyColours GetColour(string colour)
Hasta ahora tengo:
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 puede ver, estoy un poco atascado. ¿Hay alguna forma de seleccionar un enumerador por valor? Algo como:
MyColour(2)
daría como resultado
MyColour.Green
c#
string
enumeration
Matt Clarkson
fuente
fuente
Respuestas:
echa un vistazo a System.Enum.Parse:
fuente
Puedes convertir el int en una enumeración
También existe la opción de Enum.
fuente
Dados los últimos y mejores cambios en .NET (+ Core) y C # 7, esta es la mejor solución:
La variable de color se puede utilizar dentro del alcance de Enum. TryParse
fuente
Todo lo que necesitas es Enum .
fuente
Marqué la respuesta de OregonGhost +1, luego intenté usar la iteración y me di cuenta de que no estaba del todo bien porque Enum.GetNames devuelve cadenas. Desea Enum.GetValues:
fuente
Puede usar
Enum.Parse
para obtener un valor de enumeración del nombre. Puede iterar sobre todos los valores conEnum.GetNames
, y simplemente puede convertir un int en una enumeración para obtener el valor de enumeración del valor int.Así, por ejemplo:
o:
Este último arrojará una ArgumentException si no se encuentra el valor, es posible que desee atraparlo dentro de la función y devolver el valor predeterminado.
fuente
fuente
Parse
método genérico .Como se mencionó en las respuestas anteriores, puede transmitir directamente al tipo de datos subyacente (int -> tipo de enumeración) o analizar (cadena -> tipo de enumeración).
pero tenga cuidado: no hay. TryParse para las enumeraciones, por lo que necesitará un bloque try / catch alrededor del análisis para detectar fallas.
fuente
fuente
Una cosa que podría serle útil (además de las respuestas válidas / buenas proporcionadas hasta ahora) es la idea de StringEnum proporcionada aquí
Con esto puede definir sus enumeraciones como clases (los ejemplos están en vb.net):
Y ahora podría usar esta clase como usaría una enumeración: eAuthenticationMethod.WindowsAuthentication y esto sería esencialmente como asignar ' W ' al valor lógico de WindowsAuthentication (dentro de la enumeración) y si fuera a ver este valor desde una propiedad ventana (u otra cosa que use la propiedad System.ComponentModel.Description) obtendría " Usar autenticación de Windows ".
He estado usando esto durante mucho tiempo y hace que el código sea más claro en su intención.
fuente
fuente
También puede consultar algunas de las sugerencias en esta publicación de blog: Mi nuevo amigo, Enum <T>
La publicación describe una forma de crear una clase auxiliar genérica muy simple que le permite evitar la sintaxis de conversión fea inherente a
Enum.Parse
- en su lugar, termina escribiendo algo como esto en su código:O echa un vistazo a algunos de los comentarios en la misma publicación que hablan sobre el uso de un método de extensión para lograr algo similar.
fuente