2010-06-09 2 views
9

что у меня есть перечислимую что-то вроде:Поведение имитировать перечисление реализующий интерфейс

enum OrderStatus 
{ 
    AwaitingAuthorization, 
    InProduction, 
    AwaitingDespatch 
} 

Я также создал метод расширения на моем перечислении, чтобы привести в порядок, отображаемые значения в пользовательском интерфейсе, так что я что-то вроде:

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

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

     ... etc 
    } 
} 

Вдохновленный отличный пост here, я хочу, чтобы связать мои перечислений в виде SelectList с помощью метода расширения:

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

однако, использовать значение DisplayString в пользовательском интерфейсе выпадающий мне нужно добавить ограничение по линии

: where TEnum has extension ToDisplayString

Очевидно ничего из этого не будет работать вообще с текущий подход, если только не существует какой-то умной трюки, о которой я не знаю.

Есть ли у кого-нибудь идеи о том, как я могу реализовать что-то вроде этого?

ответ

24

Есть ли веская причина использовать enum здесь?

Когда вы начинаете прыгать через сумасшедшие обручи, чтобы использовать enum s, возможно, пора использовать класс.

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

Вы потребляете это то же самое, как 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); 
} 

Строка представление встроенной, и все, что вам нужно, это ToString().

+0

Я использую эту реализацию много. –

+0

Действительно приятно, спасибо –

+0

Блестящий. Небольшое предостережение: вы не можете использовать значения по умолчанию, или вы получаете «Значение параметра по умолчанию для« »должно быть константой времени компиляции. – as9876

-3

Вы можете сделать это:

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

Затем ограничить TEnum к Enum: where TEnum : System.Enum

Конечно, таким образом вы получите кучу методов на самом Enum и потерять безопасность типа.

+1

[Вы не можете написать 'где TEnum: Enum'] (http://stackoverflow.com/questions/1331739/enum-type-constraints-in-c/1416660#1416660). – SLaks

+2

@SLaks: О да, вы правы. Дайте мне -1, без пощады :) –

1

Вместо использования «ToDisplayString» просто переопределите ToString() вашего перечисления. Поэтому, если перечисление переопределяет это, оно примет это, в противном случае оно примет поведение ToString по умолчанию (в ToSelectList).

Смежные вопросы