2012-01-18 8 views
6

AList<A>, B को List<B> आदि पर सही ढंग से जोड़ने के लिए मैं इस स्निपेट को कैसे बदलूं?सूची <T> सूची में टी को जोड़ने के लिए कैसे करें <T> मास्करेड 'गतिशील' और टी 'ऑब्जेक्ट' के रूप में?

// someChild's actual type is A 
object someChild = GetObject(); 
// collection's actual type is List<A> though method below returns object 
dynamic list = GetListFromSomewhere(...); 
// code below throws a RuntimeBinderException 
list.Add(somechild); 

अपवाद है, क्योंकि जबकि Add() बांधने की मशीन द्वारा पाया जाता है, यह dynamic अधिभार संकल्प में विफल रहता है, जिसमें से गुजरता है। प्रतिबिंब का उपयोग करने के लिए उपरोक्त को बदलने के लिए, या कम से कम इसे कम करने के लिए पसंद नहीं करते हैं। मेरे पास और List<A> प्रत्येक के लिए System.Type के उदाहरण तक पहुंच है। उपरोक्त कोड वाली कक्षा या विधि स्वयं सामान्य नहीं है।

उत्तर

2

आपको बस तर्क के लिए बाध्यकारी गतिशील बनाने के लिए भी है - तो आप केवल someChild के प्रकार की जरूरत है dynamic होने के लिए:

dynamic someChild = GetObject(); 
dynamic list = GetListFromSomewhere(...); 
list.Add(somechild); 

अपने पिछले कोड में, संकलक याद होगा someChild का संकलन-समय प्रकार object था, और इसलिए निष्पादन-समय प्रकार के बजाय संकलन-समय प्रकार का उपयोग किया गया। निष्पादन-समय बाइंडर केवल ओवरलोड रिज़ॉल्यूशन के लिए गतिशील रूप से गतिशील अभिव्यक्तियों का इलाज करने में स्मार्ट है।

1

जॉन की सही तो मैं स्वीकार कर लिया है कि है, लेकिन वहाँ भी मेरे अपने भुलक्कड़पन कि List<T> लागू करता IList (गैर जेनेरिक वर्जन) है:

object someChild = GetObject(); 
var list = (IList)GetListFromSomewhere(...); 
list.Add(somechild); 
संबंधित मुद्दे

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