2010-10-27 10 views
7

मेरे पास एक दिशा एनम है:एक एक्सटेंशन विधि एक Enum में एक समारोह जोड़ने का एकमात्र तरीका है?

Public Enum Direction 
    Left 
    Right 
    Top 
    Bottom 
End Enum 

और कभी-कभी मुझे उलटा होने की आवश्यकता होती है, इसलिए यह लिखना अच्छा लगता है:

SomeDirection.Inverse() 

लेकिन मैं एक enum पर एक विधि नहीं डाल सकता! हालांकि, मैं इसे Extension Method (VS2008 +) जोड़ सकता हूं।

वीबी में, विस्तार के तरीके must be inside Modules। मुझे वास्तव में मॉड्यूल पसंद नहीं है, और मैं एक (मामूली) सरल वर्ग लिखने की कोशिश कर रहा हूं जिसे मैं एक ही फाइल में अन्य परियोजनाओं में प्लग करने के लिए साझा कर सकता हूं।

मॉड्यूल केवल फ़ाइल/नेमस्पेस स्तर में रह सकते हैं, इसलिए मेरे पास फ़ाइल के निचले हिस्से में एक है:

Public Class MyClass 
    '...' 
End Class 

Public Module Extensions 
    <Extension()> _ 
    Public Function Inverse(ByVal dir As Direction) As Direction 
     '...' 
    End Function 
End Module 

यह काम करता है, और "यदि यह तोड़ा नहीं गया है, तो इसे ठीक न करें ", लेकिन मुझे यह जानना अच्छा लगेगा कि मैं गलत कर रहा हूं और कम बॉयलरप्लेट के साथ एक बेहतर तरीका है। शायद .NET 4 में?

अंत में, मुझे पता है कि मैं एक ऐसी संरचना लिख ​​सकता हूं जो एक enum की तरह व्यवहार करता है, लेकिन यह और भी पीछे की ओर लगता है।

+1

आप जो कर रहे हैं वह बिल्कुल सही है। माइक्रोसॉफ्ट भी इसका प्रस्ताव करता है: http://msdn.microsoft.com/en-us/library/bb383974.aspx। – VinayC

+0

मुझे लगता है (अच्छा लगता है!), तो यह सही तरीका होना चाहिए। फिर भी, मुझे नहीं पता कि हम एक enum पर एक विधि क्यों नहीं डाल सकते हैं, ऐसा प्रतीत नहीं होता है कि यह कुछ तोड़ देगा। वीबी में –

उत्तर

7

यह वास्तव में एक enum के लिए एक विधि जोड़ने (उपस्थिति) का एकमात्र तरीका है।

ध्यान दें कि सी # में विस्तार विधि को स्थैतिक वर्ग पर परिभाषित किया जाएगा, लेकिन यह एक मामूली अंतर है, जो मुख्य रूप से नामकरण में से एक है।

+0

एक कक्षा को साझा (स्थिर) घोषित नहीं किया जा सकता है। AFAIK वे मॉड्यूल के बराबर हैं। लेकिन चूंकि एक विस्तार विधि एक स्थैतिक व्यक्ति के लिए सिंटैक्टिक चीनी है, इसलिए मुझे इसे एक अलग वर्ग में रखने की आवश्यकता को समझ में नहीं आता है (क्योंकि स्थैतिक विधि एक गैर स्थैतिक वर्ग में रह सकती है) –

+0

एक * एक्सटेंशन * विधि नहीं हो सकती है (सी # में) एक गैर स्थैतिक वर्ग में रहते हैं, नोट। –

+0

मुझे पता है कि यह नहीं कर सकता है, लेकिन मुझे इसके पीछे कारण समझ में नहीं आता है। –

1

आप एक ऐसा वर्ग बना सकते हैं जो एक enum की तरह व्यवहार करता है, इस अर्थ में कि इसमें स्थिर रीडोनली गुण हैं जो उस मान वाले वर्ग का एक उदाहरण लौटाते हैं।

उदाहरण के लिए System.Drawing.Color संरचना इस तरह से काम करती है (हालांकि आंतरिक मान एक enum नहीं है); इसमें स्थिर गुण हैं जैसे Color.Red और Color.White, साथ ही उदाहरण गुण और विधियां।

+0

वैसे, यह एक मॉड्यूल की तुलना में अधिक बॉयलरप्लेट होगा। यहां तक ​​कि एक वर्ग को एक enum अनुकरण करने के लिए आवश्यक नहीं है - यह संरचना में किया जा सकता है लेकिन यह वास्तव में एक enum होने का नाटक करने के लिए एक अजीब लग रहा है। –

+0

@ कैमिलो मार्टिन: हाँ, संरचना के रूप में भी इस्तेमाल किया जा सकता है, लेकिन जिस कारण से मैंने कक्षा का सुझाव दिया है वह यह है कि संरचना सही ढंग से लागू करने के लिए अधिक जटिल है। एक enum के वर्ग intead का उपयोग करने के लिए अजीब लग सकता है, लेकिन दूसरी तरफ आप एक अलग मॉड्यूल के बजाय कक्षा में तरीकों को प्राप्त कर सकते हैं। – Guffa

+0

क्यों जटिल? यह उत्तर का कोड सरल दिखता है: http://stackoverflow.com/ प्रश्न/1395401/enum-extension-method-todatasource/1395439 # 1395439 –

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