2008-09-02 17 views
6

Me imagino que todo el mundo ha sido testigo de un código como:El uso de atributos para reducir en la enumeración de mapeo de enumeración y la enumeración/const a declaraciones provistas de interruptores de acción

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

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

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

Ahora podemos usar 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 funciona. 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 algún motivo para el error de compilación? ¿Cómo podría yo pasar la información necesaria para asignar además:

EnumtoEnumAttribute(Type dest, string enumString) 

esto parece demasiado prolijo, pero si es la única manera entonces creo que lo voy a utilizar.

+0

¿Qué error de compilación está obteniendo? ¿Dónde? –

Respuesta

0

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.

0

Jennings @Danial leí a través de las reglas allí y nos pareció: "Un tipo de enumeración, siempre que tenga acceso público y los tipos en los que se está anidado (si lo hay) también tiene 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 Usted es exactamente 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 mapeando enumeraciones en otras enumeraciones.

0

¿Por qué no utilizar 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).

4

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

public enum ServerEnum 
{ 
    One = ClientEnum.ABC, 
} 

Esto tiene la ventaja de que no requiere reflexión, es más fácil de leer (en mi opinión), y en general requiere menos sobrecarga .

Cuestiones relacionadas