2009-03-25 8 views
21

के साथ अतिरिक्त जानकारी संबद्ध करना मेरा प्रश्न उदाहरण के साथ सबसे अच्छा चित्रित किया गया है।.NET Enum

मान लीजिए मैं enum है:

public enum ArrowDirection 
{ 
    North, 
    South, 
    East, 
    West 
} 

मैं इकाई वेक्टर उस दिशा के साथ प्रत्येक दिशा के लिए इसी संबद्ध करना चाहते हैं। उदाहरण के लिए मुझे ऐसा कुछ चाहिए जो उत्तर के लिए (0, 1) उत्तर देगा, (-1, 0) पश्चिम के लिए, आदि। मुझे जावा में पता है कि आप enum के अंदर एक विधि घोषित कर सकते हैं जो उस कार्यक्षमता प्रदान कर सकता है।

मेरा वर्तमान समाधान एक स्थिर विधि है - कक्षा के अंदर जो enum परिभाषित करता है - जो एरो डायरेक्शन में पारित एक वेक्टर लौटाता है (विधि लुकअप को पूरा करने के लिए हैशटेबल का उपयोग करती है लेकिन यह वास्तव में महत्वपूर्ण नहीं है) । ऐसा लगता है ... अशुद्ध।

प्रश्न:
क्या .NET में एक enum से संबंधित अतिरिक्त जानकारी संग्रहीत करने के लिए एक सर्वोत्तम अभ्यास समाधान है?

उत्तर

37

सी # 3.0 में ऐसा करने का एक नया तरीका है। कुंजी यह सुंदर तथ्य है: Enums एक्सटेंशन विधियों हो सकता है! तो, यहाँ आप क्या कर सकते हैं:

public enum ArrowDirection 
{ 
    North, 
    South, 
    East, 
    West 
} 

public static class ArrowDirectionExtensions 
{ 
    public static UnitVector UnitVector(this ArrowDirection self) 
    { 
     // Replace this with a dictionary or whatever you want ... you get the idea 
     switch(self) 
     { 
      case ArrowDirection.North: 
       return new UnitVector(0, 1); 
      case ArrowDirection.South: 
       return new UnitVector(0, -1); 
      case ArrowDirection.East: 
       return new UnitVector(1, 0); 
      case ArrowDirection.West: 
       return new UnitVector(-1, 0); 
      default: 
       return null; 
     } 
    } 
} 

अब, आप ऐसा कर सकते हैं:

var unitVector = ArrowDirection.North.UnitVector(); 

मिठाई! मुझे केवल एक महीने पहले ही यह पता चला, लेकिन यह नई सी # 3.0 सुविधाओं का एक बहुत अच्छा परिणाम है।

Here's another example on my blog.

+0

जानकारी के लिए धन्यवाद यह बहुत अच्छा है। हालांकि मुझे एक्सटेंशन के बारे में पता था, मैंने कभी भी एनम एक्सटेंशन –

+0

हाँ के लिए उनका उपयोग नहीं किया था, हाँ, मैं या तो पहले। एक दोस्त ने मुझे इसके बारे में बताया। यह बहुत अच्छा है। मैं सीखने के लिए भी हैरान था (हाल ही में, यहां SO पर) कि आप एक शून्य मूल्य पर एक विस्तार विधि को कॉल कर सकते हैं। यह अभी भी काम करता है क्योंकि यह एक स्थिर विधि है। हमेशा की तरह, सी # टीम ने इन सुविधाओं को सोचकर एक महान काम किया है। –

+0

आपको स्वीकार्य उत्तर प्राप्त करने जा रहे हैं। मैंने कोशिश की और यह पूरी तरह से काम करता है। केवल एक चीज है। मुझे वास्तव में enum घोषित करना चाहिए? अगर मैं इसे कक्षा में छोड़ देता हूं, तो यह कहता है कि यह कम सुलभ है। मुझे इसे बनाने के लिए "ClassName_Enums" कक्षा बनाना था ... – colithium

3

मैंने इसके बारे में ब्लॉग किया है here

Attributes के साथ ऐसा कुछ करने का प्रयास करें।

public enum Status { 

    [Status(Description = "Not Available")]  

    Not_Available = 1,  

    [Status(Description = "Available For Game")] 

    Available_For_Game = 2,  

    [Status(Description = "Available For Discussion")] 

    Available_For_Discussion = 3, 

    } 

    public class StatusEnumInfo { 

    private static StatusAttribute[] edesc; 

    public static String GetDescription(object e) 

    { 

     System.Reflection.FieldInfo f = e.GetType().GetField(e.ToString()); 

     StatusEnumInfo.edesc = f.GetCustomAttributes(typeof(StatusAttribute), false) as StatusAttribute[]; 

     if (StatusEnumInfo.edesc != null && StatusEnumInfo.edesc.Length == 1)   

     return StatusEnumInfo.edesc[0].Description; 

     else   

     return String.Empty; 

    } 

    public static object GetEnumFromDesc(Type t, string desc) 

    { 

     Array x = Enum.GetValues(t); 

     foreach (object o in x) { 

     if (GetDescription(o).Equals(desc)) { 

      return o; 

     } 

     } return String.Empty; 

    } 

    } 

    public class StatusAttribute : Attribute { 

    public String Description { get; set; } 

    } 



    public class Implemenation { 

    public void Run() 

    { 

     Status statusEnum = (Status)StatusEnumInfo.GetEnumFromDesc(typeof(Status), "Not Available"); 

     String statusString = StatusEnumInfo.GetDescription(Status.Available_For_Discussion); 

    } 

    } 

के बजाय विवरण, अपने कस्टम संपत्ति

0

एक बात आप को देखो सकता है "प्रकार-सुरक्षित Enum" पैटर्न का उपयोग करें। यह आपको एक enum वास्तव में एक पूर्ण स्थिर वस्तु है, जो तरीकों/गुण/आदि हो सकती है कि बनाने के लिए अनुमति देता है ..

http://www.javacamp.org/designPattern/enum.html

यहोशू बलोच ने अपनी पुस्तक में इस पद्धति के बारे में वार्ता "प्रभावी जावा।" मैंने इसे कई अलग-अलग परिस्थितियों में उपयोग किया है, और मैं वास्तव में इसे सादा enums पर पसंद करते हैं। (यह भाषा-अज्ञेयवादी है - यह जावा, सी #, या बहुत अधिक ओओ भाषा में काम करता है)।

+0

मैं भी और ऐसा लगता है का उपयोग किया है। लेकिन हाल ही में मुझे कुछ ऐसा मिला है जो मुझे और भी पसंद है। आप विस्तार विधियों को enums पर डाल सकते हैं! मजेदार है कि मुझे कितना आनंद मिलता है ... लेकिन यह वास्तव में अच्छा है। –

+0

मुझे इसे जांचना होगा, –

0

आपकी स्थिर विधि दृष्टिकोण मेरे लिए काफी साफ है। आप एक ही कक्षा के भीतर enum और स्थिर विधि दोनों encapsulate। Enum में परिवर्तन उस एकल वर्ग के भीतर केंद्रीकृत हैं।

गणना (जावा के अनुसार) में एक विधि जोड़ना वास्तव में एक बहुत ही सरल अवधारणा है जो जटिलता को जोड़ता है।

विशेषता आधारित दृष्टिकोण दिलचस्प है, लेकिन एक स्थिर विधि की तुलना में एक बार फिर चीजों को खत्म करना प्रतीत होता है।

1
using System.ComponentModel; 
using System.Reflection; 


public enum ArrowDirection 
{ 

[Description("Northwards")] 
North, 

[Description("Southwards")] 
South, 

[Description("Eastwards")] 
East, 

[Description("Westwards")] 
West 
} 

...

एक विस्तार पद्धति बनाएं विवरण की एक सूची प्राप्त करने:

public static class Enum<T> where T : struct 
{ 

    /// <summary> 
    /// Gets a collection of the enum value descriptions. 
    /// </summary> 
    /// <returns></returns> 
    public static IList<string> GetDescriptions() 
    { 
     List<string> descriptions = new List<string>(); 
     foreach (object enumValue in Enum<T>.GetValues()) 
     { 
      descriptions.Add(((Enum)enumValue).ToDescription()); 
     } 
     return descriptions; 

    } 
} 
+0

यह एक विस्तार विधि की तरह दिखता नहीं है। 'यह' पैरामीटर कहां है? साथ ही, 'ToDescription' कहां से आ रहा है? क्या यह विस्तार विधि माना जाता है? – CoderDennis

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