2010-06-09 8 views
9

Dire che ho un qualcosa di simile enum:Comportamento per simulare un enum implementazione di un'interfaccia

enum OrderStatus 
{ 
    AwaitingAuthorization, 
    InProduction, 
    AwaitingDespatch 
} 

Ho anche creato un metodo di estensione sul mio enum per riordinare i valori visualizzati nell'interfaccia utente, quindi non ho qualcosa di simile:

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

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

     ... etc 
    } 
} 

Ispirato alla ottimo post here, voglio legare il mio enumerazioni ad un SelectList con un metodo di estensione:

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

tuttavia, utilizzare i valori DisplayString nell'interfaccia utente discesa avrei bisogno di aggiungere un vincolo sulla falsariga di

: where TEnum has extension ToDisplayString

Ovviamente nulla di tutto questo sta andando a lavorare a tutti con la approccio attuale, a meno che non ci sia un trucco intelligente che non conosco.

Qualcuno ha qualche idea su come potrei essere in grado di implementare qualcosa di simile?

risposta

24

C'è un motivo valido per utilizzare uno enum qui?

Quando si inizia a saltare attraverso i circuiti impazziti per utilizzare enum s, potrebbe essere il momento di utilizzare una classe.

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"); 
} 

si consuma la stessa di 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 rappresentazione stringa è built-in, e tutto ciò che serve è ToString().

+0

Io uso questa implementazione molto. –

+0

Davvero bello, grazie –

+0

Brillante. Piccolo avvertimento: non è possibile utilizzare i valori predefiniti o si ottiene "Valore parametro predefinito per" "deve essere una costante in fase di compilazione. – as9876

-3

Si potrebbe fare questo:

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

Poi limitare Tenum a Enum: where TEnum : System.Enum

Naturalmente, in questo modo si ottiene un sacco di metodi sul Enum in sé e perdere la sicurezza tipo.

+1

[Non è possibile scrivere 'dove TEnum: Enum'] (http://stackoverflow.com/questions/1331739/enum-type-constraints-in-c/1416660#1416660). – SLaks

+2

@SLaks: Oh sì, hai ragione. Dammi -1, nessuna pietà :) –

1

Invece di utilizzare "ToDisplayString", basta sovrascrivere ToString() dell'enumerazione. Quindi se un enum ha la precedenza, lo prenderà, altrimenti prenderà il comportamento predefinito di ToString (in ToSelectList).

Problemi correlati