2010-06-09 7 views
9

Decir que tengo una enumeración algo como:Comportamiento para simular una enumeración implementar una interfaz

enum OrderStatus 
{ 
    AwaitingAuthorization, 
    InProduction, 
    AwaitingDespatch 
} 

También he creado un método de extensión en mi enumeración para poner en orden los valores que se muestran en la interfaz de usuario, por lo que tengo algo así como:

public static string ToDisplayString(this OrderStatus status) 
{ 
    switch (status) 
    { 
     case Status.AwaitingAuthorization: 
      return "Awaiting Authorization"; 

     case Status.InProduction: 
      return "Item in Production"; 

     ... etc 
    } 
} 

Inspirado por el excelente post here, quiero unir mis enumeraciones a un SelectList con un método de extensión:

public static SelectList ToSelectList<TEnum>(this TEnum enumObj)

sin embargo, utilizar los valores DisplayString en la interfaz de usuario desplegable que había necesidad de agregar una restricción en la línea de

: where TEnum has extension ToDisplayString

Obviamente nada de esto va a funcionar en absoluto con el enfoque actual, a menos que haya algún truco inteligente que yo no sepa.

¿Alguien tiene alguna idea acerca de cómo podría ser capaz de implementar algo como esto?

Respuesta

24

¿Hay una razón de peso para utilizar un enum aquí?

Al iniciar saltar a través de aros locos utilizar enum s, podría ser el momento de utilizar una clase.

public class OrderStatus 
{ 
    OrderStatus(string display) { this.display = display; } 

    string display; 

    public override string ToString(){ return display; } 

    public static readonly OrderStatus AwaitingAuthorization 
     = new OrderStatus("Awaiting Authorization"); 
    public static readonly OrderStatus InProduction 
     = new OrderStatus("Item in Production"); 
    public static readonly OrderStatus AwaitingDispatch 
     = new OrderStatus("Awaiting Dispatch"); 
} 

se consumen lo mismo que un enum:

public void AuthorizeAndSendToProduction(Order order, ProductionQueue queue) 
{ 
    if(order.Status != OrderStatus.AwaitingAuthorization) 
    { 
     Console.WriteLine("This order is not awaiting authorization!"); 
     return; 
    } 
    order.Status = OrderStatus.InProduction; 
    queue.Enqueue(order); 
} 

La representación de cadena es incorporado, y todo lo que necesita es ToString().

+0

Utilizo mucho esta implementación. –

+0

muy bonito, gracias –

+0

brillante. Pequeña advertencia:.. No puede utilizar los valores por defecto, o bien obtener "valor del parámetro por defecto para '' debe ser una constante en tiempo de compilación – as9876

-3

Usted puede hacer esto:

 
public static string ToOrderStatusDisplayString(this Enum status) 
{  
    switch ((OrderStatus)status) 
    { 
     ... 
    } 
} 

Entonces restringir TEnum a Enum: where TEnum : System.Enum

Por supuesto, de esa manera se obtiene un montón de métodos en la propia enumeración y perder la seguridad de tipos.

+1

[No se puede escribir 'donde TEnum: Enum'] (http://stackoverflow.com/questions/1331739/enum-type-constraints-in-c/1416660#1416660). – SLaks

+2

@SLaks: Oh, sí, tienes razón. Dame -1, sin piedad :) –

1

En lugar de utilizar "ToDisplayString", simplemente anular ToString() de su enumeración. Por lo tanto, si una enumeración lo reemplaza, lo tomará; de lo contrario, tomará el comportamiento predeterminado de ToString (en ToSelectList).

Cuestiones relacionadas