सी #: विधानसभा में सभी वर्गों की सूची


103

मैं अपनी विधानसभा में सभी वर्गों की एक सूची (क्रमिक रूप से - C #) का उत्पादन करना चाहूंगा।

कोई संकेत या नमूना कोड यह कैसे करें? प्रतिबिंब?


यदि आपका इरादा एक ऐसी विधानसभा की जांच करना है जो आपकी परियोजना से संदर्भित नहीं है, तो मेरा अद्यतन उत्तर देखें।
थॉरिन

जवाबों:


152

का उपयोग करें Assembly.GetTypes। उदाहरण के लिए:

Assembly mscorlib = typeof(string).Assembly;
foreach (Type type in mscorlib.GetTypes())
{
    Console.WriteLine(type.FullName);
}

1
बड़ी विधानसभाओं के लिए कोई सुझाव? जब मैं इस कोड को 13.8 MB असेंबली के लिए चलाता हूं, तो मेरा VS उदाहरण अनिश्चित काल के लिए कैसा लगता है। मैं एक छोटे से 9 KB विधानसभा की कोशिश की और यह ठीक काम किया। मुझे पता है कि आप क्या सोच रहे हैं - आपके पास 13.8 एमबी असेंबली क्यों है - यह मेरे डेटा लेयर का हिस्सा है जो नेटटीयर टेम्पलेट का उपयोग करके उत्पन्न होती है। हमारे पास कई टेबल हैं।
डिस्लेक्सिकनैबोको

1
@ डिस्लेक्सिकनैबोको: यदि आपके पास बहुत प्रकार हैं, तो उन सभी को एन्यूमरेट करने में लंबा समय लगेगा। हालांकि आपके विधानसभा में कितने प्रकार हैं ? और आप उनके साथ क्या कर रहे हैं? (क्या आप सुनिश्चित हैं कि समस्या प्रकारों को निकालने में है, या बस इसके बाद आप क्या कर रहे हैं?)
जॉन स्कीट

मैं asm.GetTypes () कॉल को अतीत में नहीं ला सकता, यह बस लटका रहता है - मेरा मतलब है कि यह स्पष्ट रूप से तथ्य यह है कि बहुत सारे प्रकार हैं - मैं कुछ भी नहीं कर सकता क्योंकि यह उन सभी को प्राप्त करने की कोशिश में दूर है। । मेरे 4 कोर में से एक पर 30% तक मेरा सीपीयू शूट करता है। मेरा मतलब है कि मैं वास्तव में सोच रहा हूं कि क्या कहने का कोई तरीका है, "अरे - केवल इस नाम स्थान में देखो" - मैं इस धारणा के तहत हूं कि यह संभव नहीं है क्योंकि गेटटाइप्स () विधि में केवल एक खाली कंस्ट्रक्टर है। मैं एक तरह का ऑब्जेक्ट ब्राउज़र बनाने की कोशिश कर रहा हूं।
डिस्लेक्सिकनकोको

1
अच्छी बात है, मैंने अभी तक कोशिश नहीं की है। अभी के लिए मेरा काम सिर्फ asm.GetType (पूरी तरह सेक्लाइज़ेडक्लासनाम) का उपयोग करके सीधे कक्षाओं को लक्षित करना है - जो काम करता है, लेकिन उपयोगकर्ता को कक्षाओं की सूची दिखाना संभव नहीं है, जो कि मैं चाहता था। यह btw का सामना करने वाला ग्राहक नहीं है, मैं इसे आंतरिक रूप से अपने लिए और अन्य डेवलपर्स के लिए उपयोग कर रहा हूं।
डिस्लेक्सिकनकोको

1
@DebugErr: हाँ - यदि आप चाहें तो इसे केवल कक्षाएं बनाना आसान है , लेकिन मेरा अनुमान है कि ओपी वास्तव में सभी प्रकारों को वास्तव में चाहता था।
जॉन स्कीट

102

मैं सिर्फ जॉन के उदाहरण से जोड़ना चाहूंगा। अपनी खुद की विधानसभा के लिए एक संदर्भ पाने के लिए, आप इसका उपयोग कर सकते हैं:

Assembly myAssembly = Assembly.GetExecutingAssembly();

System.Reflection नाम स्थान।

यदि आप ऐसी असेंबली की जांच करना चाहते हैं जिसका आपके पास कोई संदर्भ नहीं है, तो आप इनमें से किसी का भी उपयोग कर सकते हैं:

Assembly assembly = Assembly.ReflectionOnlyLoad(fullAssemblyName);
Assembly assembly = Assembly.ReflectionOnlyLoadFrom(fileName);

यदि आप अपने प्रकार को प्राप्त करने का इरादा रखते हैं, तो आप इसे पा सकते हैं:

Assembly assembly = Assembly.Load(fullAssemblyName);
Assembly assembly = Assembly.LoadFrom(fileName);

देखें विधानसभा वर्ग प्रलेखन अधिक जानकारी के लिए।

एक बार जब आपके पास Assemblyऑब्जेक्ट का संदर्भ होता है , तो आप assembly.GetTypes()जॉन की तरह उपयोग कर सकते हैं जो पहले से ही प्रदर्शित है।


मैं एक पूरी तरह से अलग विधानसभा का संदर्भ कैसे दे सकता हूं जो मेरे समाधान में है?
एलेक्स

13
सबसे आसान तरीका यह typeofहै कि आप जिस प्रकार को जानते हैं, उस विधानसभा में उपयोग करें, और फिर Assemblyसंपत्ति, जैसा कि मेरे उदाहरण में है।
जॉन स्कीट

2
यदि आप किसी असेंबली का संदर्भ लेना चाहते हैं, तो abc.dll का कहना है, जो आपके समाधान में है और यदि आप dll नाम को हार्ड-कोडिंग कर रहे हैं, तो असेंबली को संदर्भित करने का एक और तरीका है: 'विधानसभा असेंबली = असेंबली। लोड ("एबीसी");
काश

यह केवल वर्तमान विधानसभा को लोड करता है। मेरे पास 4 डीएलएस या परियोजनाओं का उपयोग करके एक एप्लिकेशन या एक्सई है। मैं उन dll के वर्गों के नाम कैसे प्राप्त कर सकता हूं?
एर मयंक

@JonSkeet "आधुनिक" सी # वातावरण में यह कैसे संभव होगा? जैसे कि UWP डेवलपमेंट करते समय। UWP में GetExecutingAssembly () विधि नहीं है।
डैनियल आर्मस्ट्रांग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.