2009-02-05 23 views
17

में उपसमूह मेरे पास एक मौजूदा enum है जिसमें कई आइटम हैं।एनम सबसेट या सी #

मेरे पास मौजूदा कोड भी है जो इस enum के साथ कुछ चीजें करता है।

अब मुझे केवल एक सबसेट एनम सदस्यों को देखने का तरीका पसंद आएगा। जो मैं खोज रहा हूं वह समूह में अपने enum को विभाजित करने का एक तरीका है। मुझे प्रत्येक सदस्य के (int) मूल्य को संरक्षित करने की आवश्यकता है और यदि आवश्यक हो तो मुझे सभी enum सदस्यों को देखने की क्षमता को संरक्षित करने की आवश्यकता है।

केवल एक चीज मैं के बारे में सोच सकते हैं बस प्रत्येक subenum कि केवल आइटम मैं एक ही नाम और मान का उपयोग कर चाहते शामिल के लिए एक नया enum तैयार करना है।

यह काम करता है लेकिन पूरे पुनरावृत्ति सिद्धांत का उल्लंघन करता है।

मैं किसी के लिए एक बेहतर विकल्प है की उम्मीद नहीं है, लेकिन मैंने सोचा कि मैं पूछना चाहता हूँ बस में मामला किसी ने मुझे दिखाने के लिए एक फैंसी चाल थी।

धन्यवाद, हमेशा के रूप में।

+0

मैं वहाँ क्या आप चाहते हैं (यह आपके द्वारा क्या मतलब है पर निर्भर करता है करने के लिए एक रास्ता है नहीं लगता कि" दृश्य ")। लेकिन अगर आप बड़ी तस्वीर का वर्णन कर सकते हैं, तो शायद आपके लक्ष्य को पूरा करने का एक बेहतर तरीका है? – colithium

+0

मेरे enum का बिंदु साथी डेवलपर्स को इसके नाम के आधार पर एक निश्चित मूल्य चुनने की अनुमति देना है। मेरा enum बहुत बड़ा हो रहा है और कभी-कभी यह अच्छा होगा अगर डेवलपर्स केवल एक निश्चित समूह के आधार पर enum सदस्यों का सबसेट देख सकें। वह समूह तय है। –

उत्तर

2

अंत में, मैं कोड के बहुत लेकिन निम्नलिखित "चाल" निकाला गया था के पुनर्लेखन के लिए था:

मैं सी # enums ट्रैश किए गए और एक नियमित कक्षा पर स्थिर सदस्यों का उपयोग करें। यह कक्षा एक सिंगलटन में बनाई गई थी और आवेदन शुरू होने पर इसे शामिल किया गया था।

मेरे स्थिर सदस्यों के कंस्ट्रक्टर्स एक "जनक" के रूप में एक और स्थिर सदस्य को संदर्भित करने की अनुमति है।

इसके बाद, मेरी init विधि प्रत्येक स्थिर सदस्य और अनुक्रमित उन्हें कई गुणों के आधार पर के माध्यम से जाना प्रतिबिंब का उपयोग करता है। ये इंडेक्स हैशटेबल्स में संग्रहीत हैं जो सिंगलटन के सदस्य भी हैं।

मैं इस प्रकार मिलता है:

एक सिंगलटन वस्तु जो:

  • स्थिर सदस्यों जो आसानी से डिजाइन समय के दौरान पहुँचा जा सकता है है।
  • कुछ स्थिर सदस्यों ("समूह" और अन्य गुणों के आधार पर) को देखने के लिए रन-टाइम के दौरान उपयोग किया जा सकता है।

मेरे init विधि मान्यता भी पर्याप्त मात्रा में होता है। यदि अमान्य (जैसे डुप्लिकेट) स्थिर सदस्य बनाए जाते हैं, तो आपको एप्लिकेशन स्टार्टअप पर रन-टाइम त्रुटि मिलती है।

स्पष्ट रूप से एक बहुत बड़ा हैक लेकिन मैं इसके साथ काफी खुश हूं।

10

आप एक गणन का उपयोग कर मान निर्धारित कर सकता है, लेकिन फिर स्थिर कक्षाओं में स्थिरांक के माध्यम से उन्हें संदर्भ ताकि आपके डेवलपर्स बड़े enum द्वारा बिना सामना करना पड़ा नहीं मिलता है। आप हो सकता है:

enum MySuperEnumGroup 
{ 
    Group1Item1, 
    Group1Item2, 
    Group1Item3, 

    Group2Item1, 
    Group2Item2, 
    Group2Item3, 

    Group3Item1, 
    Group3Item2, 
    Group3Item3, 
} 

static class MySuperEnumGroup_Group1 
{ 
    public const MySuperEnumGroup Item1 = MySuperEnumGroup.Group1Item1; 
    public const MySuperEnumGroup Item2 = MySuperEnumGroup.Group1Item2; 
    public const MySuperEnumGroup Item3 = MySuperEnumGroup.Group1Item3; 
} 

static class MySuperEnumGroup_Group2 
{ 
    public const MySuperEnumGroup Item1 = MySuperEnumGroup.Group2Item1; 
    public const MySuperEnumGroup Item2 = MySuperEnumGroup.Group2Item2; 
    public const MySuperEnumGroup Item3 = MySuperEnumGroup.Group2Item3; 
} 

//etc. 
+1

सभी enum सदस्यों को कैसे देखें? – Mhd

3

यह मदद कर सकता है: Fake Enums in C#

+2

धन्यवाद, यह एक दिलचस्प लेख है। –

8

मैं इस के साथ जाना होगा (जो कम से कम VB.NET में काम करता है) जब आप की जरूरत है

enum MySuperEnumGroup 
{ 
    Group1Item1, 
    Group1Item2, 
    Group1Item3, 

    Group2Item1, 
    Group2Item2, 
    Group2Item3, 

    Group3Item1, 
    Group3Item2, 
    Group3Item3, 
} 

enum MySubEnumGroup 
{ 
Group2Item1 = MySuperEnumGroup.Group2Item1 
Group3Item1 = MySuperEnumGroup.Group3Item1 
Group3Item3 = MySuperEnumGroup.Group3Item3 
} 

फिर CTYPE किसी तरह से करते हैं।

2

enums, स्पष्ट मान नहीं है, तो उन्हें एक देने के लिए और झंडे का उपयोग करें "समूहों" को परिभाषित करने के लिए:

[Flags] 
enum MySuperEnumGroup 
{ 
    Group1 = 1 << 0, 
    Group2 = 1 << 1, 
    Group3 = 1 << 2, 

    Group1Item1 = 1 << 10 | Group1, 
    Group1Item2 = 1 << 11 | Group1, 
    Group1Item3 = 1 << 12 | Group1, 

    Group2Item1 = 1 << 13 | Group2, 
    Group2Item2 = 1 << 14 | Group2, 
    Group2Item3 = 1 << 15 | Group2, 

    Group3Item1 = 1 << 16 | Group3, 
    Group3Item2 = 1 << 17 | Group3, 
    Group3Item3 = 1 << 18 | Group3, 
} 

तो फिर तुम Enum.GetValues और HasFlag उपयोग कर सकते हैं किसी दिए गए "समूह के लिए मूल्यों को प्राप्त करने के लिए ":

var group1 = Enum.GetValues(typeof(MySuperEnumGroup)) 
       .Cast<MySuperEnumGroup>() 
       .Where(value => value.HasFlag(MySuperEnumGroup.Group1)) 
       .ToArray(); 
संबंधित मुद्दे