switch example enum c# .net enums attributes custom-attributes

example - return enum c#



Obtener el atributo enum from enum (5)

Aquí hay un método de ayuda que debe apuntar en la dirección correcta.

protected Als GetEnumByStringValueAttribute(string value) { Type enumType = typeof(Als); foreach (Enum val in Enum.GetValues(enumType)) { FieldInfo fi = enumType.GetField(val.ToString()); StringValueAttribute[] attributes = (StringValueAttribute[])fi.GetCustomAttributes( typeof(StringValueAttribute), false); StringValueAttribute attr = attributes[0]; if (attr.Value == value) { return (Als)val; } } throw new ArgumentException("The value ''" + value + "'' is not supported."); }

Y para llamarlo, solo haz lo siguiente:

Als result = this.GetEnumByStringValueAttribute<Als>(ComboBox.SelectedValue);

Probablemente esta no sea la mejor solución, ya que está vinculada a Als y es probable que desee volver a utilizar este código. Lo que probablemente quiera es quitar el código de mi solución para devolverle el valor del atributo y luego simplemente usar Enum.Parse como lo hace en su pregunta.

Tengo

public enum Als { [StringValue("Beantwoord")] Beantwoord = 0, [StringValue("Niet beantwoord")] NietBeantwoord = 1, [StringValue("Geselecteerd")] Geselecteerd = 2, [StringValue("Niet geselecteerd")] NietGeselecteerd = 3, }

con

public class StringValueAttribute : Attribute { private string _value; public StringValueAttribute(string value) { _value = value; } public string Value { get { return _value; } } }

Y me gustaría poner el valor del ítem que seleccioné de un combobox en un int:

int i = (int)(Als)Enum.Parse(typeof(Als), (string)cboAls.SelectedValue); //<- WRONG

¿Es posible? y si lo es, cómo? ( StringValue coincide con el valor seleccionado del cuadro combinado).


Aquí hay un par de métodos de extensión que utilizo para este propósito exacto, los reescribí para usar su StringValueAttribute , pero como Oliver , uso el DescriptionAttribute en mi código.

public static T FromEnumStringValue<T>(this string description) where T : struct { Debug.Assert(typeof(T).IsEnum); return (T)typeof(T) .GetFields() .First(f => f.GetCustomAttributes(typeof(StringValueAttribute), false) .Cast<StringValueAttribute>() .Any(a => a.Value.Equals(description, StringComparison.OrdinalIgnoreCase)) ) .GetValue(null); }

Esto se puede hacer un poco más simple en .NET 4.5:

public static T FromEnumStringValue<T>(this string description) where T : struct { Debug.Assert(typeof(T).IsEnum); return (T)typeof(T) .GetFields() .First(f => f.GetCustomAttributes<StringValueAttribute>() .Any(a => a.Value.Equals(description, StringComparison.OrdinalIgnoreCase)) ) .GetValue(null); }

Y para llamarlo, solo haz lo siguiente:

Als result = ComboBox.SelectedValue.FromEnumStringValue<Als>();

Por el contrario , aquí hay una función para obtener la cadena a partir de un valor enum:

public static string StringValue(this Enum enumItem) { return enumItem .GetType() .GetField(enumItem.ToString()) .GetCustomAttributes<StringValueAttribute>() .Select(a => a.Value) .FirstOrDefault() ?? enumItem.ToString(); }

Y para llamarlo:

string description = Als.NietBeantwoord.StringValue()


Estoy usando DescriptionAttribute de Microsoft y el siguiente método de extensión:

public static string GetDescription(this Enum value) { if (value == null) { throw new ArgumentNullException("value"); } string description = value.ToString(); FieldInfo fieldInfo = value.GetType().GetField(description); DescriptionAttribute[] attributes = (DescriptionAttribute[]) fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false); if (attributes != null && attributes.Length > 0) { description = attributes[0].Description; } return description; }


No estoy seguro de si me falta algo aquí, no puedes hacer esto,

Als temp = (Als)combo1.SelectedItem; int t = (int)temp;


Viniendo aquí de los enlaces duplicados de esta pregunta y respuesta muy votada , este es un método que funciona con la nueva restricción de tipo Enum C # 7.3. Tenga en cuenta que también necesita especificar que también es una struct para que pueda convertirlo en el TEnum? o de lo contrario obtendrás un error.

public static TEnum? GetEnumFromDescription<TEnum>(string description) where TEnum : struct, Enum { var comparison = StringComparison.OrdinalIgnoreCase; foreach (var field in typeof(TEnum).GetFields()) { var attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; if (attribute != null) { if (string.Compare(attribute.Description, description, comparison) == 0) return (TEnum)field.GetValue(null); } if (string.Compare(field.Name, description, comparison) == 0) return (TEnum)field.GetValue(null); } return null; }