valor recorrer que pasar parse parametro obtener enumerador enum convertir convert como buscar c# enumeration

recorrer - pasar enum como parametro c#



¿Hay alguna forma de iterar a través de todos los valores enum? (9)

Posible duplicado:
C #: ¿Cómo enumerar una enumeración?

El sujeto dice todo. Quiero usar eso para agregar los valores de una enumeración en un cuadro combinado.

Gracias

vIceBerg


A menudo es útil definir un Min y Max dentro de su enumeración, que siempre será el primero y el último elemento. Aquí hay un ejemplo muy simple usando la sintaxis de Delphi:

procedure TForm1.Button1Click(Sender: TObject); type TEmployeeTypes = (etMin, etHourly, etSalary, etContractor, etMax); var i : TEmployeeTypes; begin for i := etMin to etMax do begin //do something end; end;


El problema con el uso de enumeraciones para rellenar caídas es que no puedes tener personajes o espacios extraños en las enumeraciones. Tengo un código que extiende enumeraciones para que pueda agregar cualquier carácter que desee.

Úselo así ..

public enum eCarType { [StringValue("Saloon / Sedan")] Saloon = 5, [StringValue("Coupe")] Coupe = 4, [StringValue("Estate / Wagon")] Estate = 6, [StringValue("Hatchback")] Hatchback = 8, [StringValue("Utility")] Ute = 1, }

Vincular datos como tal ..

StringEnum CarTypes = new StringEnum(typeof(eCarTypes)); cmbCarTypes.DataSource = CarTypes.GetGenericListValues();

Aquí está la clase que extiende la enumeración.

// Author: Donny V. // blog: http://donnyvblog.blogspot.com

using System; using System.Collections; using System.Collections.Generic; using System.Reflection; namespace xEnums { #region Class StringEnum /// <summary> /// Helper class for working with ''extended'' enums using <see cref="StringValueAttribute"/> attributes. /// </summary> public class StringEnum { #region Instance implementation private Type _enumType; private static Hashtable _stringValues = new Hashtable(); /// <summary> /// Creates a new <see cref="StringEnum"/> instance. /// </summary> /// <param name="enumType">Enum type.</param> public StringEnum(Type enumType) { if (!enumType.IsEnum) throw new ArgumentException(String.Format("Supplied type must be an Enum. Type was {0}", enumType.ToString())); _enumType = enumType; } /// <summary> /// Gets the string value associated with the given enum value. /// </summary> /// <param name="valueName">Name of the enum value.</param> /// <returns>String Value</returns> public string GetStringValue(string valueName) { Enum enumType; string stringValue = null; try { enumType = (Enum) Enum.Parse(_enumType, valueName); stringValue = GetStringValue(enumType); } catch (Exception) { }//Swallow! return stringValue; } /// <summary> /// Gets the string values associated with the enum. /// </summary> /// <returns>String value array</returns> public Array GetStringValues() { ArrayList values = new ArrayList(); //Look for our string value associated with fields in this enum foreach (FieldInfo fi in _enumType.GetFields()) { //Check for our custom attribute StringValueAttribute[] attrs = fi.GetCustomAttributes(typeof (StringValueAttribute), false) as StringValueAttribute[]; if (attrs.Length > 0) values.Add(attrs[0].Value); } return values.ToArray(); } /// <summary> /// Gets the values as a ''bindable'' list datasource. /// </summary> /// <returns>IList for data binding</returns> public IList GetListValues() { Type underlyingType = Enum.GetUnderlyingType(_enumType); ArrayList values = new ArrayList(); //List<string> values = new List<string>(); //Look for our string value associated with fields in this enum foreach (FieldInfo fi in _enumType.GetFields()) { //Check for our custom attribute StringValueAttribute[] attrs = fi.GetCustomAttributes(typeof (StringValueAttribute), false) as StringValueAttribute[]; if (attrs.Length > 0) values.Add(new DictionaryEntry(Convert.ChangeType(Enum.Parse(_enumType, fi.Name), underlyingType), attrs[0].Value)); } return values; } /// <summary> /// Gets the values as a ''bindable'' list<string> datasource. ///This is a newer version of ''GetListValues()'' /// </summary> /// <returns>IList<string> for data binding</returns> public IList<string> GetGenericListValues() { Type underlyingType = Enum.GetUnderlyingType(_enumType); List<string> values = new List<string>(); //Look for our string value associated with fields in this enum foreach (FieldInfo fi in _enumType.GetFields()) { //Check for our custom attribute StringValueAttribute[] attrs = fi.GetCustomAttributes(typeof(StringValueAttribute), false) as StringValueAttribute[]; if (attrs.Length > 0) values.Add(attrs[0].Value); } return values; } /// <summary> /// Return the existence of the given string value within the enum. /// </summary> /// <param name="stringValue">String value.</param> /// <returns>Existence of the string value</returns> public bool IsStringDefined(string stringValue) { return Parse(_enumType, stringValue) != null; } /// <summary> /// Return the existence of the given string value within the enum. /// </summary> /// <param name="stringValue">String value.</param> /// <param name="ignoreCase">Denotes whether to conduct a case-insensitive match on the supplied string value</param> /// <returns>Existence of the string value</returns> public bool IsStringDefined(string stringValue, bool ignoreCase) { return Parse(_enumType, stringValue, ignoreCase) != null; } /// <summary> /// Gets the underlying enum type for this instance. /// </summary> /// <value></value> public Type EnumType { get { return _enumType; } } #endregion #region Static implementation /// <summary> /// Gets a string value for a particular enum value. /// </summary> /// <param name="value">Value.</param> /// <returns>String Value associated via a <see cref="StringValueAttribute"/> attribute, or null if not found.</returns> public static string GetStringValue(Enum value) { string output = null; Type type = value.GetType(); if (_stringValues.ContainsKey(value)) output = (_stringValues[value] as StringValueAttribute).Value; else { //Look for our ''StringValueAttribute'' in the field''s custom attributes FieldInfo fi = type.GetField(value.ToString()); StringValueAttribute[] attrs = fi.GetCustomAttributes(typeof (StringValueAttribute), false) as StringValueAttribute[]; if (attrs.Length > 0) { _stringValues.Add(value, attrs[0]); output = attrs[0].Value; } } return output; } /// <summary> /// Parses the supplied enum and string value to find an associated enum value (case sensitive). /// </summary> /// <param name="type">Type.</param> /// <param name="stringValue">String value.</param> /// <returns>Enum value associated with the string value, or null if not found.</returns> public static object Parse(Type type, string stringValue) { return Parse(type, stringValue, false); } /// <summary> /// Parses the supplied enum and string value to find an associated enum value. /// </summary> /// <param name="type">Type.</param> /// <param name="stringValue">String value.</param> /// <param name="ignoreCase">Denotes whether to conduct a case-insensitive match on the supplied string value</param> /// <returns>Enum value associated with the string value, or null if not found.</returns> public static object Parse(Type type, string stringValue, bool ignoreCase) { object output = null; string enumStringValue = null; if (!type.IsEnum) throw new ArgumentException(String.Format("Supplied type must be an Enum. Type was {0}", type.ToString())); //Look for our string value associated with fields in this enum foreach (FieldInfo fi in type.GetFields()) { //Check for our custom attribute StringValueAttribute[] attrs = fi.GetCustomAttributes(typeof (StringValueAttribute), false) as StringValueAttribute[]; if (attrs.Length > 0) enumStringValue = attrs[0].Value; //Check for equality then select actual enum value. if (string.Compare(enumStringValue, stringValue, ignoreCase) == 0) { output = Enum.Parse(type, fi.Name); break; } } return output; } /// <summary> /// Return the existence of the given string value within the enum. /// </summary> /// <param name="stringValue">String value.</param> /// <param name="enumType">Type of enum</param> /// <returns>Existence of the string value</returns> public static bool IsStringDefined(Type enumType, string stringValue) { return Parse(enumType, stringValue) != null; } /// <summary> /// Return the existence of the given string value within the enum. /// </summary> /// <param name="stringValue">String value.</param> /// <param name="enumType">Type of enum</param> /// <param name="ignoreCase">Denotes whether to conduct a case-insensitive match on the supplied string value</param> /// <returns>Existence of the string value</returns> public static bool IsStringDefined(Type enumType, string stringValue, bool ignoreCase) { return Parse(enumType, stringValue, ignoreCase) != null; } #endregion } #endregion #region Class StringValueAttribute /// <summary> /// Simple attribute class for storing String Values /// </summary> public class StringValueAttribute : Attribute { private string _value; /// <summary> /// Creates a new <see cref="StringValueAttribute"/> instance. /// </summary> /// <param name="value">Value.</param> public StringValueAttribute(string value) { _value = value; } /// <summary> /// Gets the value. /// </summary> /// <value></value> public string Value { get { return _value; } } } #endregion }


Poco más "complicado" (tal vez exagerado) pero utilizo estos dos métodos para devolver diccionarios para usarlos como fuentes de datos. El primero devuelve el nombre como clave y el segundo valor como clave.

public static IDictionary<string, int> ConvertEnumToDictionaryNameFirst<K>() { if (typeof(K).BaseType != typeof(Enum)) { throw new InvalidCastException(); } return Enum.GetValues(typeof(K)).Cast<int>().ToDictionary(currentItem => Enum.GetName(typeof(K), currentItem)); }

O podrías hacer

public static IDictionary<int, string> ConvertEnumToDictionaryValueFirst<K>() { if (typeof(K).BaseType != typeof(Enum)) { throw new InvalidCastException(); } return Enum.GetNames(typeof(K)).Cast<string>().ToDictionary(currentItem => (int)Enum.Parse(typeof(K), currentItem)); }

Esto supone que estás usando 3.5. Tendría que reemplazar las expresiones lambda si no.

Utilizar:

Dictionary list = ConvertEnumToDictionaryValueFirst<SomeEnum>();

using System; using System.Collections.Generic; using System.Linq;


Podría iterar a través de la matriz devuelta por el método Enum.GetNames en su lugar.

public class GetNamesTest { enum Colors { Red, Green, Blue, Yellow }; enum Styles { Plaid, Striped, Tartan, Corduroy }; public static void Main() { Console.WriteLine("The values of the Colors Enum are:"); foreach(string s in Enum.GetNames(typeof(Colors))) Console.WriteLine(s); Console.WriteLine(); Console.WriteLine("The values of the Styles Enum are:"); foreach(string s in Enum.GetNames(typeof(Styles))) Console.WriteLine(s); } }


Sé que otros ya han respondido con una respuesta correcta, sin embargo, si desea utilizar las enumeraciones en un cuadro combinado, es posible que desee ir al patio adicional y asociar cadenas a la enumeración para que pueda proporcionar más detalles en el cadena visualizada (como espacios entre palabras o cadenas de visualización usando una carcasa que no coincide con sus estándares de codificación)

Esta entrada de blog puede ser útil: asociar cadenas con enumeraciones en c #

public enum States { California, [Description("New Mexico")] NewMexico, [Description("New York")] NewYork, [Description("South Carolina")] SouthCarolina, Tennessee, Washington }

Como beneficio adicional, también proporcionó un método de utilidad para enumerar la enumeración que ahora he actualizado con los comentarios de Jon Skeet

public static IEnumerable<T> EnumToList<T>() where T : struct { Type enumType = typeof(T); // Can''t use generic type constraints on value types, // so have to do check like this if (enumType.BaseType != typeof(Enum)) throw new ArgumentException("T must be of type System.Enum"); Array enumValArray = Enum.GetValues(enumType); List<T> enumValList = new List<T>(); foreach (T val in enumValArray) { enumValList.Add(val.ToString()); } return enumValList; }

Jon también señaló que en C # 3.0 se puede simplificar a algo como esto (que ahora se vuelve tan liviano que me imagino que podrías hacerlo en línea):

public static IEnumerable<T> EnumToList<T>() where T : struct { return Enum.GetValues(typeof(T)).Cast<T>(); } // Using above method statesComboBox.Items = EnumToList<States>(); // Inline statesComboBox.Items = Enum.GetValues(typeof(States)).Cast<States>();


Si necesita que los valores del combo se correspondan con los valores de la enumeración, también puede usar algo como esto:

foreach (TheEnum value in Enum.GetValues(typeof(TheEnum))) dropDown.Items.Add(new ListItem( value.ToString(), ((int)value).ToString() );

De esta forma, puede mostrar los textos en el menú desplegable y recuperar el valor (en la propiedad SelectedValue)


Use el método Enum.GetValues:

foreach (TestEnum en in Enum.GetValues(typeof(TestEnum))) { ... }

No es necesario que los copie en una cadena, y de esa manera puede simplemente recuperarlos al convertir la propiedad SelectedItem en un valor de TestEnum directamente también.


string[] names = Enum.GetNames (typeof(MyEnum));

A continuación, rellene el menú desplegable con la matriz


.NET 3.5 lo hace simple mediante el uso de métodos de extensión:

enum Color {Red, Green, Blue}

Puede ser iterado con

Enum.GetValues(typeof(Color)).Cast<Color>()

o define un nuevo método genérico estático:

static IEnumerable<T> GetValues<T>() { return Enum.GetValues(typeof(T)).Cast<T>(); }

Tenga en cuenta que la iteración con el método Enum.GetValues ​​() usa la reflexión y, por lo tanto, tiene penalizaciones de rendimiento.