कुछ अतिरिक्त के साथ चलाने के लिए कैसे: यदि आपका सामान्य वर्ग कई प्रकार के स्वीकार करता है, यदि आप कॉमा जब तुम प्रकार के नाम को छोड़ देते हैं, उदाहरण के लिए शामिल करना चाहिए कैंची कोड। मान लीजिए आप एक वर्ग
public class Encoder() {
public void Markdown(IEnumerable<FooContent> contents) { do magic }
public void Markdown(IEnumerable<BarContent> contents) { do magic2 }
}
के समान कार्यावधि में मान लीजिए आप एक FooContent
हैं आप संकलन समय पर बाध्य करने के लिए सक्षम थे है कि आप चाहते थे
var fooContents = new List<FooContent>(fooContent)
new Encoder().Markdown(fooContents)
हालांकि आप इसे रनटाइम पर नहीं कर सकते हैं। रनटाइम पर ऐसा करने के लिए आप की तर्ज पर करना होगा:
var listType = typeof(List<>).MakeGenericType(myType);
var dynamicList = Activator.CreateInstance(listType);
((IList)dynamicList).Add(fooContent);
गतिशील विधि कॉल में dynamic
के उपयोग आह्वान करने के लिए Markdown(IEnumerable<FooContent> contents)
new Encoder().Markdown((dynamic) dynamicList)
नोट। रनटाइम dynamicList
पर List<FooContent>
(अतिरिक्त रूप से IEnumerable<FooContent>
भी होगा) क्योंकि गतिशीलता का उपयोग अभी भी दृढ़ता से टाइप की गई भाषा के लिए रूट है, रन टाइम बाइंडर उपयुक्त Markdown
विधि का चयन करेगा। यदि कोई सटीक प्रकार का मिलान नहीं है, तो यह ऑब्जेक्ट पैरामीटर विधि की तलाश करेगा और यदि रनटाइम बाइंडर अपवाद से मेल नहीं खाता है तो यह चेतावनी दी जाएगी कि कोई विधि मेल नहीं खाती है।
इस दृष्टिकोण पर स्पष्ट ड्रॉ संकलन समय पर प्रकार की सुरक्षा का एक बड़ा नुकसान है। फिर भी इन लाइनों के साथ कोड आपको एक बहुत ही गतिशील भावना में संचालित करने देगा जो रनटाइम पर अभी भी पूरी तरह से टाइप किया गया है जैसा कि आप उम्मीद करते हैं।
स्रोत
2014-10-14 19:10:30
जेनिक्स! = टेम्पलेट्स। सभी जेनेरिक प्रकार चर संकलित समय पर हल होते हैं और रनटाइम पर नहीं। यह उन परिस्थितियों में से एक है जहां 4.0 का 'गतिशील' प्रकार उपयोगी हो सकता है। – Will
@Will - किस तरह से? जेनरिक्स के साथ उपयोग किए जाने पर, वर्तमान सीटीपी के तहत आप अनिवार्य रूप से
@MarcGravell आप रन टाइम विधि के लिए 'foo.Method ((गतिशील) myGenericClass) का उपयोग कर सकते हैं एक प्रकार के विधि अधिभार के लिए बाध्यकारी, प्रभावी रूप से सेवा लोकेटर पैटर्न। –