2011-02-16 22 views
7

मैं एक विशेष संग्रह को कार्यान्वित करने की कोशिश कर रहा था जो ObservableCollection जैसे कुछ और तंत्र को समाहित करने के लिए काम करता है, ऐसा करने के लिए कि मैं अपने संग्रह को Collection से प्राप्त करने देता हूं और मैं उसी इंटरफ़ेस को भी लागू करता हूं।ऑब्जर्जेबल कोलेक्शन <T> कैसे काम करता है?

मैं सिर्फ हालांकि नहीं मिलता है कैसे एक वास्तव में, पूरे संग्रह-बदल-तर्क को लागू करता है उदाहरण के Collection<T>.Add के लिए ओवरराइड किया जा रहा है (यह भी आभासी रूप में चिह्नित नहीं है), तो कैसे ObservableCollection आग CollectionChanged घटना यदि आइटम करता है उस विधि का उपयोग कर जोड़ा गया था?

उत्तर

10

अपने विशिष्ट प्रश्न का उत्तर देने के लिए, Collection<T>.AddInsertItem आभासी विधि (यह जांचने के बाद कि संग्रह केवल पढ़ने के लिए नहीं है) को कॉल करता है। ObservableCollection<T> वास्तव में सम्मिलित और प्रासंगिक परिवर्तन अधिसूचनाओं को बढ़ाने के लिए इस विधि को ओवरराइड करता है।

+0

आह पर देखा जा सकता है, ताकि इसका तरीका है कि काम करता है, तो आप एक बार फिर से धन्यवाद करके ऐसा करता है! (आप इसे कैसे जानते हैं?) –

+1

@ एचबी, क्या आपने [रिफ्लेक्टर] (http://www.red-gate.com/products/dotnet-development/reflector/) के बारे में सुना है? –

+0

@ डारिन मेरे पास है लेकिन उन्होंने मुझे बताया कि अब यह पैसा खर्च करता है और अगर मैं अपने सिस्टम पर एक प्रतिलिपि छोड़ देता हूं तो वे मुझे शिकार करेंगे http://tirania.org/blog/archive/2011/Feb-04.html –

0

याद रखें, कुंजी बेस संग्रह विधियों को ओवरराइड करने में नहीं है, यह वास्तव में है कि आप आईसीओलेक्शन इंटरफेस को कार्यान्वित करेंगे। और स्पष्ट रूप से, एक संग्रह वर्ग से विरासत के बजाय, मैं सुझाव देता हूं कि एक एडाप्टर क्लास बनाना जो कि कन्स्ट्रक्टर में आईसीओलेक्शन लेता है और आपकी विधियां केवल आंतरिक संग्रह में प्रतिनिधि होंगी और उपयुक्त घटनाएं बढ़ाएंगी।

8

यह InsertItem बुला जो ओवरराइड की गई है और decompilation

protected override void InsertItem(int index, T item) 
{ 
    this.CheckReentrancy(); 
    base.InsertItem(index, item); 
    this.OnPropertyChanged("Count"); 
    this.OnPropertyChanged("Item[]"); 
    this.OnCollectionChanged(NotifyCollectionChangedAction.Add, item, index); 
} 
+0

धन्यवाद, एनी भी तेज था हालांकि मैंने इसे एक को सौंप दिया। –