2010-06-09 19 views
9

कहो मैं की तरह एक enum कुछ है को लागू करने के लिए एक enum अनुकरण करने के लिए:व्यवहार एक अंतरफलक

enum OrderStatus 
{ 
    AwaitingAuthorization, 
    InProduction, 
    AwaitingDespatch 
} 

मैं अपने enum यूआई में दिखाया मूल्यों को साफ़ रखने के लिए पर एक विस्तार विधि बना लिया है, तो मेरे पास है कुछ की तरह:

:

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 करने के लिए मेरे enums बाध्य करने के लिए चाहते हैं

हालांकि, यूआई में DisplayString मानों का उपयोग कर ड्रॉप डाउन के साथ मैं बिल्कुल भी काम करने के लिए

: where TEnum has extension ToDisplayString

जाहिर है इस में से कोई भी जा रहा है की तर्ज पर एक बाधा को जोड़ने की आवश्यकता होगी वर्तमान दृष्टिकोण, जब तक कि कुछ चालाक चाल नहीं है मुझे पता नहीं है।

क्या किसी के पास इस बारे में कोई विचार है कि मैं इस तरह कुछ कैसे कार्यान्वित कर सकता हूं? इस तरह आप Enum पर ही तरीकों में से एक गुच्छा मिलता है where TEnum : System.Enum

बेशक

, और प्रकार सुरक्षा खोना:

उत्तर

24

क्या enum का उपयोग करने के लिए कोई अनिवार्य कारण है?

जब आप enum एस का उपयोग करने के लिए पागल हुप्स के माध्यम से कूदना शुरू करते हैं, तो यह कक्षा का उपयोग करने का समय हो सकता है।

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) 
    { 
     ... 
    } 
} 

फिर Enum को TEnum प्रतिबंधित।

+1

[आप 'जहां टीनम: एनम'] नहीं लिख सकते हैं (http://stackoverflow.com/questions/1331739/enum-type-constraints-in-c/1416660#1416660)। – SLaks

+2

@ स्लक्स: ओह हाँ, आप सही हैं। मुझे दो, कोई दया नहीं :) –

1

"ToDisplayString" का उपयोग करने के बजाय, बस अपने enum के ToString() को ओवरराइड करें। तो अगर एक enum इसे ओवरराइड करता है तो यह इसे ले जाएगा, अन्यथा यह डिफ़ॉल्ट ToString व्यवहार (ToSelectList में) ले जाएगा।

संबंधित मुद्दे