type parse from enum convertir convert c# .net enums casting

c# - parse - No se puede convertir el tipo ''System.Enum'' a int



enum.tryparse c# (7)

¿Por qué no analizar la enumeración a una cadena y devolver el valor de enumeración real?

public enum MyEnum { Flower = 1, Tree = 2, Animal = 3 }; string name = MyEnum.Flower.ToString(); // returns "Flower"

Creo que .ToString() está en desuso y no estoy seguro de la nueva forma de hacerlo. ¿Pensaría que la representación real de enumeración sería más útil que la int?

(Ok, expondré las profundidades de mi ignorancia aquí, por favor sea amable)

Fondo

Tengo un método que se ve (un poco) así:

public void AddLink(Enum enumVal) { string identifier = m_EnumInterpreter(enumVal); AddLink(identifier); }

El EnumInterpreter es un Func <Enum, cadena> que se pasa cuando se crea la clase principal.

Estoy usando Enum porque en este nivel no es "asunto de mi negocio". No me importa qué enumeración específica sea. El código de llamada solo usa una enumeración (generada) para evitar cadenas mágicas.

Pregunta

Si el EnumInterpreter envía una cadena vacía, me gustaría lanzar una excepción con el valor real de enumVal. Pensé que solo sería capaz de lanzar a int, pero el compilador no lo tendrá. ¿Qué estoy haciendo mal? (Por favor no digas ''todo'').


Entiendo que probablemente esta no sea la solución a su problema exacto, pero solo quiero publicar cómo resolví esto para una API particular que estaba usando.

int result = (int) (ActualEnumType) MethodThatReturnsSystemEnumType( arg1, arg2 );

Esperemos que eso sea de ayuda para alguien. Doble fundido FTW.


No sé si incluir esto en mi pregunta, o como respuesta. El problema es que no es LA respuesta, pero es la respuesta que funciona para mí.

Lo que descubrí, por casualidad, mientras intentaba algo más, es que si simplemente lo meto en el extremo de una cuerda, obtengo lo que quiero:

throw new Exception("EnumInterpreter returns empty string for enumVal=" + enumVal); //EnumInterpreter returns empty string for enumVal=3720116125

Realmente simplifiqué a int en mi pregunta, el tipo de datos real es uint (en este caso en particular). Afortunadamente, dado que solo quería la cuerda, no tengo que preocuparme por eso.

No estoy seguro de cuál de las otras tres respuestas es "correcta", así que vote ...


No, no puedes convertirlo en un int porque System.Enum no es una enumeración, es solo la clase base para enums.

EDITAR:

Puedes obtener el valor de la siguiente manera, pero es feo:

int intVar = (int)enuYourEnum.GetType().GetField("value__").GetValue(objYourEnum);


System.Enum no se puede convertir directamente a Integer, pero implementa explícitamente IConvertible, lo que significa que puede usar lo siguiente:

public void AddLink(Enum enumVal) { string identifier = m_EnumInterpreter(Convert.ToInt32(enumVal)); AddLink(identifier); }

Tenga en cuenta que si su Enum utiliza realmente algo distinto a un Integer (como un flotador), perderá los datos no enteros en la conversión. O, obviamente, reemplace la llamada Convert con lo que esté convirtiendo (si se sabe)


Varias cosas aquí:

1) la respuesta de Ryan se ve bien, pero ... Preferiría pasar el Enum al traductor de la enumeración, para que pueda hacer todo el Convert.To ... allí. Si sabe que está utilizando SOLO enumeraciones basadas en enteros, el Convert.ToInt32 () está bien. De lo contrario, es posible que desee agregar utilizando reflexión o intentar / capturar otras conversiones.

2) También puede considerar utilizar miembros de la clase Enum, como .GetName (), .GetValue (), etc., ya que tratan directamente con los nombres y valores definidos independientemente del tipo de enumeración.

3) técnicamente no lanzaría la excepción fuera del intérprete de enumeración. Si esa condición es generalmente cierta, lance la excepción desde dentro del intérprete de enumeración, para que todos los usos de la clase se beneficien de la validación. O podrías terminar duplicando el código.

4) parece que tienes un fondo en C ++ / MFC a partir de la asignación de nombres de tus variables. Es posible que desee entrar en las convenciones de nombres de estilo C #, le facilitará la vida al usar / leer códigos y bibliotecas de otras personas. Echa un vistazo a StyleCop de MS para obtener un buen complemento que te ayude con los nombres.


prueba esto..

m_EnumInterpreter ((int) (object) enumVal);