2013-12-11 3 views
6

क्या प्रत्येक वर्ग के माध्यम से नामस्थान में लूप करना संभव है और प्रत्येक वर्ग के लिए ऑब्जेक्ट प्रारंभ करना संभव है?किसी दिए गए नेमस्पेस में सभी कक्षाओं के माध्यम से लूप करें और प्रत्येक के लिए ऑब्जेक्ट बनाएं?

उदाहरण के लिए, मैं टेस्ट में सभी कक्षाओं के माध्यम से लूप करना चाहता हूं। पीओएस नेमस्पेस, प्रत्येक वर्ग के लिए ऑब्जेक्ट बनाएं, और प्रत्येक ऑब्जेक्ट पर runImportProcess विधि को कॉल करें।

मुझे पता है कि मैं बहुत की तरह एक नाम स्थान के माध्यम से लूप कर सकते हैं:

Type[] typelist = GetTypesInNamespace(Assembly.GetExecutingAssembly(), 
             "Test.POS"); 

foreach (Type t in typelist) 
{ 
    Console.WriteLine(t.Name); 
} 

मुझे यकीन है कि अगर यह पूरा करने के लिए जो मैं चाहता इस t चर का उपयोग करना संभव है नहीं कर रहा हूँ। नौसिखिए के लिए कोई अंतर्दृष्टि?

उत्तर

4

Assembly.GetTypes() आज़माएं। फिर उन्हें नामस्थान द्वारा फ़िल्टर करें (और सुनिश्चित करें कि वे वही हैं जो आप चाहते हैं)। उन्हें तत्काल करने के लिए, Activator.CreateInstance(...) का उपयोग करें।

+0

बिल्कुल सही! अब, असली चुनौती इस नई वस्तु पर 'runImportProcess()' विधि को कॉल करना है। चूंकि संकलक कक्षा के गुणों और संकलन समय के तरीकों से अवगत नहीं है, क्या यह भी संभव है? इस उदाहरण को देखते हुए, ऐसा लगता है कि मुझे प्रोग्रामेटिक रूप से परिभाषित करना है कि 'एक्टिवेटर' क्रिएटइन्स्टेंस() '- 'ऑब्जेक्ट टाइप टाइप = (ऑब्जेक्ट टाइप) एक्टिवेटर। क्रिएट इंस्टेंस (ऑब्जेक्ट टाइप);' – TimeBomb006

+1

आप इसे कर सकते हैं - यहां तक ​​कि बेहतर - साझा इंटरफ़ेस बनाएं। –

4

इस प्रयास करें:

var types = Assembly 
    .GetExecutingAssembly() 
    .GetTypes() 
    .Where(t => t.Namespace.StartsWith("Test.POS")); 

foreach (var t in types) 
{ 
    Console.WriteLine(t.Name); 
} 
3

आप GetConstructor विधि का उपयोग कर सकते हैं

using System; 
using System.Reflection; 

class Addition 
{ 
    public Addition(int a) 
    { 
     Console.WriteLine("Constructor called, a={0}", a); 
    } 
} 

class Test 
{ 
    static void Main() 
    { 
     Type type = typeof(Addition); 
     ConstructorInfo ctor = type.GetConstructor(new[] { typeof(int) }); 
     object instance = ctor.Invoke(new object[] { 10 }); 
    } 
} 
1

आप परावर्तक उपयोग कर सकते हैं एक विधानसभा से सभी वर्गों को पाने के लिए:

Getting all types in a namespace via reflection

और उसके बाद पुनर्प्राप्ति के नए उदाहरण बनाने के लिए एक्टिवेटर का उपयोग करें डी कक्षाएं:

Get a new object instance from a Type

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