मैं एक नाम स्थान के भीतर सभी कक्षाएं कैसे प्राप्त कर सकता हूं?


80

जवाबों:


142

आपको इसे "पीछे" करने की आवश्यकता होगी; एक विधानसभा में सभी प्रकारों को सूचीबद्ध करें और फिर प्रत्येक प्रकार के नामस्थान की जाँच करें:

using System.Reflection;
private Type[] GetTypesInNamespace(Assembly assembly, string nameSpace)
{
    return 
      assembly.GetTypes()
              .Where(t => String.Equals(t.Namespace, nameSpace, StringComparison.Ordinal))
              .ToArray();
}

उपयोग का उदाहरण:

Type[] typelist = GetTypesInNamespace(Assembly.GetExecutingAssembly(), "MyNamespace");
for (int i = 0; i < typelist.Length; i++)
{
    Console.WriteLine(typelist[i].Name);
}

.Net 2.0 से पहले जहां कुछ भी Assembly.GetExecutingAssembly()उपलब्ध नहीं है, वहां आपको असेंबली प्राप्त करने के लिए एक छोटे से समाधान की आवश्यकता होगी:

Assembly myAssembly = typeof(<Namespace>.<someClass>).GetTypeInfo().Assembly;
Type[] typelist = GetTypesInNamespace(myAssembly, "<Namespace>");
for (int i = 0; i < typelist.Length; i++)
{
    Console.WriteLine(typelist[i].Name);
}

2
.Where (t => String.Equals (t.Namespace, nameSpace, StringComparison.Ordinal)
abatishchev

8
यह भी ध्यान रखें कि असेंबली! = नेमस्पेस - कुछ नामस्थान कई विधानसभाओं में फैले हुए हैं।
बेवन

1
और सिर्फ एक IEnumerable <प्रकार> वापस करने के लिए क्यों नहीं? सभी अधिक है, आप परिणामों के बीच एक गणना करते हैं, यह भी 'के लिए' के ​​बजाय 'foreach' बेहतर है, मुझे लगता है।
abatishchev

2
अच्छी टिप्पणी, इसके लिए धन्यवाद। IEnumerable <टाइप> पर रिटर्न टाइप करने से अंतिम ToArray कॉल की आवश्यकता समाप्त हो जाती है। यकीन नहीं होता कि मैं सहमत हूं कि 'फॉरच' हालांकि 'के लिए' से बेहतर है; जैसा कि मैं देख रहा हूं कि यह प्रदर्शन अंतर उपेक्षित है, इसलिए मुझे लगता है कि यह व्यक्तिगत शैली में आता है। लेकिन 'फॉर्च्यूनर' को प्राथमिकता देने के लिए एक अच्छा तर्क हो सकता है; यदि ऐसा है तो इसे साझा करने के लिए स्वतंत्र महसूस करें; मुझे गलत साबित होना पसंद है :)
फ्रेड्रिक मोर्क

3
मुझे लगता है कि व्यक्तिगत रूप से देखने के लिए foreach सिर्फ आसान है। पर्दे के पीछे दो छोरों प्रदर्शन के संबंध में बहुत अधिक हैं।
Chev

5

आपको थोड़ी और जानकारी देने की आवश्यकता होगी ...

क्या आपका मतलब रिफ्लेक्शन से है। आप एक असेंबली मेनिफेस्ट के माध्यम से पुनरावृति कर सकते हैं और उपयोग करने वाले प्रकारों की एक सूची प्राप्त कर सकते हैं

   System.Reflection.Assembly myAssembly = Assembly.LoadFile("");

   myAssembly.ManifestModule.FindTypes()

यदि यह केवल विजुअल स्टूडियो में है, तो आप केवल सूची को इंटेलीसेंस विंडो में प्राप्त कर सकते हैं, या ऑब्जेक्ट ब्राउज़र (CTRL + W, J) खोलकर


0

परावर्तन के साथ आप एक विधानसभा में सभी प्रकार के माध्यम से लूप को शांत करते हैं। एक प्रकार की एक Namespace संपत्ति है जिसका उपयोग आप केवल उन नामस्थान को फ़िल्टर करने के लिए करते हैं, जिनमें आप रुचि रखते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.