2010-06-09 73 views
9

說我有一個枚舉類似:行爲來模擬一個枚舉實現一個接口

enum OrderStatus 
{ 
    AwaitingAuthorization, 
    InProduction, 
    AwaitingDespatch 
} 

我也對我的枚舉整理在UI中顯示的值創建一個擴展方法,所以我有是這樣的:

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)

然而,在UI使用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

我使用這個實現了很多。 – 2010-06-09 16:49:27

+0

真的很好,謝謝 – 2015-03-02 00:23:06

+0

輝煌。小警告:你不能使用默認值,或者你得到「」的默認參數值必須是編譯時常量。 – as9876 2015-06-17 14:56:49

-3

你可以這樣做:

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

然後限制TEnum來枚舉:where TEnum : System.Enum

當然,這樣你會得到一堆的枚舉本身的方法和失去類型安全。

+1

[你不能寫'where TEnum:Enum'](http://stackoverflow.com/questions/1331739/enum-type-constraints-in-c/1416660#1416660)。 – SLaks 2010-06-09 17:11:21

+2

@SLaks:哦,是的,你是對的。給我-1,不要憐憫:) – 2010-06-10 12:05:41

1

而不是使用「ToDisplayString」,只需覆蓋枚舉的ToString()。所以如果一個枚舉覆蓋它,它會採用它,否則它將採用默認的ToString行爲(在ToSelectList中)。

相關問題