Convierte una cadena en una lista en C#

c# string enums


¿Cuál es la mejor manera de convertir una cadena en un valor de enumeración en C#?

Tengo una etiqueta de selección HTML que contiene los valores de una enumeración.Cuando la página se publique,quiero recoger el valor (que estará en forma de cadena)y convertirlo en el valor de la enumeración.

En un mundo ideal,podría hacer algo así:

StatusEnum MyStatus = StatusEnum.Parse("Active");

pero ese no es un código válido.




Answer 1 Keith


En .NET Core y .NET> 4 hay un método de análisis genérico :

Enum.TryParse("Active", out StatusEnum myStatus);

Esto también incluye las nuevas variables out línea de C # 7 , por lo que realiza la conversión try-parse al tipo de enumeración explícita e inicializa + llena la variable myStatus .

Si tienes acceso a C#7 y al último .NET esta es la mejor manera.

Respuesta original

En .NET es bastante feo (hasta 4 o más):

StatusEnum MyStatus = (StatusEnum) Enum.Parse(typeof(StatusEnum), "Active", true);

Tiendo a simplificar esto con:

public static T ParseEnum<T>(string value)
{
    return (T) Enum.Parse(typeof(T), value, true);
}

Entonces puedo hacerlo:

StatusEnum MyStatus = EnumUtil.ParseEnum<StatusEnum>("Active");

Una opción sugerida en los comentarios es añadir una extensión,que es bastante simple:

public static T ToEnum<T>(this string value)
{
    return (T) Enum.Parse(typeof(T), value, true);
}

StatusEnum MyStatus = "Active".ToEnum<StatusEnum>();

Por último,es posible que desee tener un listado por defecto para usar si la cadena no puede ser analizada:

public static T ToEnum<T>(this string value, T defaultValue) 
{
    if (string.IsNullOrEmpty(value))
    {
        return defaultValue;
    }

    T result;
    return Enum.TryParse<T>(value, true, out result) ? result : defaultValue;
}

Lo que hace que esta sea la llamada:

StatusEnum MyStatus = "Active".ToEnum(StatusEnum.None);

Sin embargo, sería cuidadoso al agregar un método de extensión como este a la string ya que (sin control de espacio de nombres) aparecerá en todas las instancias de string ya sea que contengan una enumeración o no (así 1234.ToString().ToEnum(StatusEnum.None) haría ser válido pero sin sentido). A menudo es mejor evitar saturar las clases principales de Microsoft con métodos adicionales que solo se aplican en contextos muy específicos, a menos que todo su equipo de desarrollo comprenda muy bien lo que hacen esas extensiones.




Answer 2 Erwin Mayer


Utilice Enum.TryParse<T>(String, T) (≥ .NET 4.0):

StatusEnum myStatus;
Enum.TryParse("Active", out myStatus);

Se puede simplificar aún más con la alineación de tipos de parámetros de C # 7.0 :

Enum.TryParse("Active", out StatusEnum myStatus);



Answer 3 McKenzieG1


Tenga en cuenta que el rendimiento de Enum.Parse() es horrible, ya que se implementa a través de la reflexión. (Lo mismo es cierto de Enum.ToString , que va al revés).

Si necesita convertir cadenas a Enums en código sensible al rendimiento, su mejor opción es crear un Dictionary<String,YourEnum> al inicio y usarlo para realizar sus conversiones.




Answer 4 DavidWhitney


Estás buscando Enum .

SomeEnum enum = (SomeEnum)Enum.Parse(typeof(SomeEnum), "EnumValue");



Answer 5 Foyzul Karim


Puede usar métodos de extensión ahora:

public static T ToEnum<T>(this string value, bool ignoreCase = true)
{
    return (T) Enum.Parse(typeof (T), value, ignoreCase);
}

Y puede llamarlos por el siguiente código (aquí, FilterType es un tipo de enumeración):

FilterType filterType = type.ToEnum<FilterType>();