2009-03-14 14 views
17

मुझे समझाने का सबसे आसान तरीका कोड नमूना के साथ है। यह संकलन नहीं है, लेकिन वहाँ किसी भी तरह से इस प्रभाव को प्राप्त करने के लिए है: यह है कि अगर काम करेगायदि आप रनटाइम तक अज्ञात हैं तो क्या आप सी # में जेनेरिक विधियों का उपयोग कर सकते हैं?

foreach(Type someType in listOfTypes) 
{ 
    SomeMethod<someType>(); 
} 

वास्तव में सुविधाजनक होगा, लेकिन ऐसा नहीं है। क्या ऊपर की तरह एक ही चीज़ हासिल करने का कोई और तरीका है, और सी # क्यों कानूनी कथन होने की अनुमति नहीं देता है?

संपादित करें: ऐसा करने का एकमात्र तरीका प्रतिबिंब के माध्यम से है जो हमारी आवश्यकताओं के लिए बहुत धीमा हो सकता है। इस बारे में कोई अंतर्दृष्टि क्यों नहीं है कि इसमें कोई कुशल तरीका क्यों नहीं बनाया गया है और क्या ऐसा कुछ सी # 4.0 के कार्यों में है?

+0

यह सुनिश्चित नहीं है कि आप यहां क्या हासिल करने की कोशिश कर रहे हैं। क्या आप कुछ संदर्भ और/या कुछ तरीकों के बारे में स्पष्टीकरण प्रदान कर सकते हैं जो कुछ तरीकों को करने की आवश्यकता है (और इसे किसी प्रकार की सूची के लिए क्यों करना है), कृपया? – Noldorin

+0

हाँ आप प्रतिबिंब के साथ ऐसा कर सकते हैं जैसा कि अन्य ने उल्लेख किया है लेकिन ध्यान रखें कि प्रतिबिंब खूनी धीमा है। यदि आपके मामले में प्रदर्शन महत्वपूर्ण है, तो कुछ अन्य दृष्टिकोण पर विचार करें। –

+0

मुझे नए ऑब्जेक्ट जोड़े या निकाले जाने पर चिंता करने के बिना हमारे ऑब्जेक्ट डेटाबेस में सभी प्रकारों को इंडेक्स करने की आवश्यकता है, आदि – Davy8

उत्तर

22

आप प्रतिबिंब का उपयोग कर सकते हैं। वर्तमान वस्तु मान लिया जाये कि SomeMethod() विधि शामिल, कोड इस प्रकार दिखाई देगा ऐसा करने के लिए:

GetType().GetMethod("SomeMethod"). 
    MakeGenericMethod(new Type[] { someType }).Invoke(this, null); 

ध्यान दें कि यदि SomeMethod() गैर सरकारी है, अपने कोड कम विश्वास के वातावरण में निष्पादित नहीं हो सकता है।

23

क्यों सी # कानूनी विवरण होने की अनुमति नहीं देता है?

जैसा कि अन्य ने नोट किया है, आप यह नहीं कर सकते हैं। क्यों नहीं? ,

foreach(Type someType in listOfTypes) 
{ 
    SomeMethod<someType>(); 
} 

सूचना है कि प्रकारों की सूची में प्रत्येक प्रकार के क्रम तक ज्ञात नहीं किया जा सकता है जबकि SomeMethod के प्रकार के पैरामीटर संकलन समय में पता होना चाहिए: ठीक है, अपने उदाहरण पर विचार करें। आपके आमंत्रण को हल करने के लिए संकलक कोSomeMethod<T> बताना असंभव है, इसलिए यह अवैध है।

सी # 4 में, सीएलआर में डीएलआर को शामिल करने के साथ यह और कई अन्य समान चीजें संभव होंगी। विशेष रूप से, गतिशील विधि आमंत्रण आपको उन तरीकों का आह्वान करने में सक्षम बनाता है जिन्हें संकलित समय पर ज्ञात नहीं किया जा सकता है।

+0

मेरी इच्छा है कि मैं 2 स्वीकृत उत्तरों को चिह्नित कर सकता हूं क्योंकि मुझे लगता है कि मैंने 2 प्रश्न पूछे थे। – Davy8

+3

चिंता मत करो, कोई मुश्किल भावना नहीं! StackOverflow अच्छे उत्तरों से भरा हुआ है जो स्वीकार नहीं किए जाते हैं। आपने उस व्यक्ति को चुना जिसने आपको सबसे अधिक महत्व दिया - मैं उत्सुकता के लिए थोड़ी अतिरिक्त जानकारी जोड़ रहा हूं।;) –

+0

अब सी # 4 जारी किया गया है, क्या आप 'गतिशील' –

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

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