2010-11-22 16 views
10

हमारे पास हमारे स्रोत में एक आम घटक है जिसमें एक बहुत बड़े आवेदन के लिए सभी enums (लगभग 300!) शामिल हैं।सी # या वीबीएनईटी - सभी सार्वजनिक enums Iterate

क्या सी # या वीबी.नेट का उपयोग करके कोई भी तरीका है, ताकि उनमें से प्रत्येक पर कार्रवाई करने के लिए उन सभी के माध्यम से पुनरावृत्ति हो सके?

सवाल How to iterate all “public string” properties in a .net class लगभग प्रासंगिक है लेकिन enums मैं के साथ काम कर रहा हूँ एक बार आपके विधानसभाओं के सभी लोड किए गए हैं, तो आप प्रत्येक विधानसभा के माध्यम से पुनरावृति और फोन GetTypes() सभी प्रकार के वापस जाने के लिए कर सकते हैं प्रकार

उत्तर

16

इन पंक्तियों के साथ कुछ?

var query = Assembly.GetExecutingAssembly() 
        .GetTypes() 
        .Where(t => t.IsEnum && t.IsPublic); 

foreach (Type t in query) 
{ 
    Console.WriteLine(t); 
} 
+0

मैं इसे काम करने के लिए जाता हूं ('var a = assembly.Load (" MyAssembly ") का उपयोग करके;' और 'var query = a.GetTypes()। जहां (t => t.IsEnum && t.IsPublic);') लेकिन फिर मैं उनका उपयोग कैसे करूं? सभी 't' टाइप 'सिस्टम हैं। रनटाइम टाइप' और मैं उन्हें एन्म्स के रूप में उपयोग करना चाहता हूं (इस प्रतिबिंब सामग्री के लिए बहुत नया!) – Shevek

+0

@ शेवेक: यह एक अलग सवाल है। इन सभी विभिन्न enums के साथ आप वास्तव में क्या करना चाहते हैं? – LukeH

+0

मुझे प्रत्येक Enums को पुन: सक्रिय करने और लुकअप तालिका बनाने के लिए SQL डालने स्क्रिप्ट उत्पन्न करने की आवश्यकता है – Shevek

2

का मिश्रण हैं (आप वैकल्पिक रूप से निजी प्रकार भी प्राप्त कर सकते हैं, हालांकि इसमें अधिक समय लगेगा)। आप ईएसईएन द्वारा टाइप किए गए प्रकारों को केवल उन लोगों को प्राप्त करने के लिए फ़िल्टर कर सकते हैं जो enum प्रकार हैं। ध्यान दें कि यह सभी बीसीएल एनम प्रकारों को भी वापस कर देगा। यदि आप बीसीएल प्रकार नहीं चाहते हैं, तो आपको उन्हें फ़िल्टर करना होगा। आप उन विधानसभाओं को अनदेखा करके उनसे अधिक से छुटकारा पा सकते हैं जिनके नाम "सिस्टम" से शुरू होते हैं। वैकल्पिक रूप से, आप यह जांच सकते हैं कि पथ में आपका स्थानीय पथ है, यह मानते हुए कि आपकी सभी परियोजना असेंबली आपके EXE के लिए स्थानीय हैं।

3

यह आपको शुरू करना चाहिए। भारित असेंबली में प्रकार के माध्यम से Iterate; और जांचें कि वे एक enum हैं:

List<string> enumValues = new List<string>(); 
foreach(Type t in AppDomain.CurrentDomain.GetAssemblies().Select(a=>a.GetTypes().Where(t=>t.IsEnum))) 
{ 
    enumValues.AddRange(Enum.GetNames(t)); 
} 
+1

यह रनटाइम त्रुटि देता है: 'System.ype' टाइप करने के लिए 'WhereArrayIterator'1 [System.Type]' टाइप करने में असमर्थ। ' – Shevek

+0

+1 आपके 'अयोग्य श्रेणी' के रूप में मेरे समाधान में काफी मदद मिली! – Shevek

+2

@ शेवेक मुझे एक ही अपवाद मिला। असल में, मुझे इस प्रश्न को एक और संदर्भ में उस अपवाद के कारण की तलाश में मिला। यह SelectMany द्वारा चयन को प्रतिस्थापित करके हल किया जाता है। मैंने जवाब अपडेट किया। –

2

मान लीजिए कि आपके पास असेंबली है जिस पर enums रहता है।

IEnumerable<Type> enums = assembly.GetTypes.Where(t => t.IsEmum); 
1

यदि आपके पास सब enums एक आम enum में संकलित आप इस की तर्ज पर कुछ इस्तेमाल कर सकते हैं:

using System; 

namespace SomeApp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      foreach(MyEnum target in Enum.GetValues(typeof(MyEnum))) 
      { 
       Console.WriteLine(target.ToString()); 
       // You can obviously perform an action on each one here. 
      } 
     } 
    } 

    enum MyEnum 
    { 
     One, 
     Two, 
     Three, 
     Four, 
     Five 
    }; 
} 

/* 
Prints... 

One 
Two 
Three 
Four 
Five 
*/ 

उम्मीद है कि इस प्राप्त कर सकते हैं आप नीचे सही रास्ते शुरू कर दिया।

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