enumeración establecida en cadena y obtener valor de picadura cuando sea necesario

No se como hacer esto
Quiero un código como el siguiente

enum myenum
{
    name1 = "abc",
    name2 = "xyz"
}

y compruébalo

if (myenum.name1 == variable)

como puedo hacer esas cosas

Gracias.

preguntado el 03 de mayo de 12 a las 07:05

¿Qué quieres lograr? No es así como se usan las enumeraciones. Tu if condición no tiene sentido - siempre volvería true si funciono porque name1 fue declarado tener abc como su valor. Una condición útil sería if (var == myenum.name1). -

5 Respuestas

Desafortunadamente eso no es posible. Las enumeraciones solo pueden tener un tipo subyacente básico (int, uint, short, etc). Si desea asociar los valores de enumeración con datos adicionales, aplique atributos a los valores (como el DescriptionAttribute).

public static class EnumExtensions
{
    public static TAttribute GetAttribute<TAttribute>(this Enum value)
        where TAttribute : Attribute
    {
        var type = value.GetType();
        var name = Enum.GetName(type, value);
        return type.GetField(name)
            .GetCustomAttributes(false)
            .OfType<TAttribute>()
            .SingleOrDefault();
    }

    public static String GetDescription(this Enum value)
    {
        var description = GetAttribute<DescriptionAttribute>(value);
        return description != null ? description.Description : null;
    }
}

enum MyEnum
{
    [Description("abc")] Name1,
    [Description("xyz")] Name2,
}

var value = MyEnum.Name1;
if (value.GetDescription() == "abc")
{
    // do stuff...
}

contestado el 03 de mayo de 12 a las 08:05

¿por qué no simplemente enum.ToString("F") ? - ghanashyaml

Según aquí lo que haces no es posible. Lo que podría hacer tal vez sería tener una clase estática llena de constantes, tal vez algo así:

class Constants
{
    public static string name1 = "abc";
    public static string name2 = "xyz";
}

...

if (Constants.name1 == "abc")...

contestado el 23 de mayo de 17 a las 12:05

Esto fue discutido aquí antes, pero no puedo encontrarlo. Versión corta: no puede dar valores de cadena a los miembros de la enumeración. Puede usar los nombres de los miembros como valores, pero a menudo esto no es lo que desea. Por favor siga este enlace para obtener una guía sobre cómo usar los atributos para anotar valores de cadena en los miembros de la enumeración.

contestado el 03 de mayo de 12 a las 07:05

Dependiendo de lo que quieras hacer, tal vez podrías lograr el mismo efecto usando un Diccionario en lugar de enums.

contestado el 03 de mayo de 12 a las 07:05

Buenas respuestas aquí. La elaboración de la respuesta sugerida es si le gustaría más bien obtener el valor de enumeración dada la descripción de enumeración. No he probado esto, pero esto podría funcionar:

Enum:

public enum e_BootloadSource : byte
{
    [EnumMember]
    [Display(Name = "UART")]
    [Description("UART_BL_RDY4RESET")]
    UART = 1,
    [EnumMember]
    [Display(Name = "SD")]
    [Description("SD_BL_RDY4RESET")]
    SD = 2,
    [EnumMember]
    [Display(Name = "USB")]
    [Description("USB_BL_RDY4RESET")]
    USB = 3,
    [EnumMember]
    [Display(Name = "Fall Through Mode")]
    [Description("FALL_THRGH_BL_RDY4RESET")]
    FALL_THROUGH_MODE = 4,
    [EnumMember]
    [Display(Name = "Cancel Bootload")]
    [Description("BL_CANCELED")]
    CANCEL_BOOTLOAD = 5,
}

Úselo de la siguiente manera:

foreach(e_BootloadSource BLSource in Enum.GetValues(typeof(e_BootloadSource)))
                    {
                        if (BLSource.GetDescription() == inputPieces[(int)SetBLFlagIndex.BLSource])
                        {
                            newMetadata.BootloadSource = BLSource;
                        }
                    }

Tenga en cuenta que inputpieces es puramente una matriz de cadenas y newMetadata.BootloadSource es e_BootloadSource.

Respondido 03 Oct 16, 09:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.