switch example enum c# reflection enums attributes

c# - example - Usar atributos para reducir enum enum mapping y enum/const para action change statments



return enum c# (5)

Me imagino que todos han visto código como:

public void Server2ClientEnumConvert( ServerEnum server) { switch(server) { case ServerEnum.One: return ClientEnum.ABC //And so on.

En lugar de esta maldad, podríamos hacer algo así como:

public enum ServerEnum { [Enum2Enum(ClientEnum.ABC)] One, }

Ahora podemos utilizar la reflexión para extraer a través de ServerEnum y obtener las asignaciones de conversión de la declaración enum.

El problema que estoy teniendo aquí está en la declaración del atributo Enum2Enum.

Esto funciona, pero reemplazar el objeto o con Enum e no lo hace. No quiero poder pasar objetos al constructor, solo otras enumeraciones.

public class EnumToEnumAttribute : Attribute { public EnumToEnumAttribute(object o){} }

Esto no se puede compilar.

public class EnumToEnumAttribute : Attribute { public EnumToEnumAttribute(Enum e){} }

¿Hay alguna razón para el error de compilación? ¿De qué otra forma podría pasar la información necesaria para mapear además?

EnumtoEnumAttribute(Type dest, string enumString)

Esto parece demasiado detallado, pero si es la única forma, supongo que lo usaré.


@Danial Jennings Leí las reglas allí y encontré: "Un tipo de enumeración, siempre que tenga acceso público y los tipos en los que está anidado (si lo hay) también tienen acceso público (Sección 17.2)".

¿Cómo falla la prueba de Enum e en el constructor en función de la regla citada? ¿Es porque ser de tipo enum no garantiza que las enumeraciones transmitidas sean públicamente visibles? Esto parece correcto. ¿Hay alguna manera de forzar esta regla en tiempo de compilación?

@ bdukes Estás exactamente en lo correcto. Debería haber pensado en eso más.

Parece que la verificación de tipo de tiempo de ejecución es mi única opción para asegurarme de que solo estoy asignando enumeraciones a otras enumeraciones.


¿Por qué no usar un diccionario? ¿Esta podría ser una propiedad estática de tu clase, inicializada con esos iniciales de objetos de fantasía schmancy que obtuvimos en 3.0? No estaría escribiendo más código (la asignación debe hacerse incluso con la solución de Atributo).


Probablemente usaría struct como tipo, y luego lanzaría una excepción si no es un tipo Enum. No veo cómo su opción (Tipo, cadena) es más segura que usar objeto o estructura.


Utilizando casi el mismo ejemplo, puede lograr esto directamente en la enumeración:

public enum ServerEnum { One = ClientEnum.ABC, }

Esto tiene el beneficio de no requerir Reflexión, es más fácil de leer (en mi opinión), y en general requiere menos sobrecarga.