2012-02-27 14 views
10

मैं एक ऐसी घटना को संभालने में कामयाब रहा हूं जो एक सूची और टी टी न्यूटिम को इंगित करने वाले ईवेंट तर्कों को पास करता है, और मेरा काम सूची में न्यूटिम जोड़ना है।टी के किसी आइटम को कैसे सूचीबद्ध करें <T> बिना टी जानने के कैसे?

मैं उन सभी प्रकार की जांच किए बिना ऐसा कैसे कर सकता हूं जो मुझे पता है टी हो सकता है?

वर्तमान कोड इस के एक जोड़े दर्जन लाइनों है:

private void DataGridCollectionViewSource_CommittingNewItem(object sender, DataGridCommittingNewItemEventArgs e) 
{ 
    Type t = e.CollectionView.SourceCollection.GetType(); 

    if (t == typeof(List<Person>)) 
    { 
    List<Person> source = e.CollectionView.SourceCollection as List<Person>; 
    source.Add(e.Item as Person); 
    } 
    else if (t == typeof(List<Place>)) 
    { 
    List<Place> source = e.CollectionView.SourceCollection as List<Place>; 
    source.Add(e.Item as Place); 
    } 
    ... 

अगर यह कुछ इस तरह करना संभव थे मैं पसंद करेंगे:

((List<T>) e.CollectionView.SourceCollection).Add((T)e.Item); 

कोई भी विचार?

उत्तर

16

आप यहाँ जेनरिक का उपयोग नहीं करते:

IList source = (IList)e.CollectionView.SourceCollection; 
source.Add(e.Item); 

तुम भी IList के स्थान पर ICollection इस्तेमाल कर सकते हैं।

+0

'System.Collections.ICollection' के लिए एक परिभाषा शामिल नहीं है 'जोड़ें' - यही कारण है कि मैंने इसे शुरुआत में पोस्ट किया था, लेकिन मैंने IList की कोशिश नहीं की थी, वह एक काम करता है। धन्यवाद। – Alain

+0

@ एलेन आह, काफी मेला - मुझे पता चला कि किस तरीके से इंटरफ़ेस (iirc यह गैर-जेनेरिक और जेनेरिक संस्करणों के बीच थोड़ा अलग है) –

+0

एक सैनिटी चेक के रूप में, क्या कोई तरीका है कि मैं यह सत्यापित कर सकता हूं कि SourceCollection e.Item के समान प्रकार का है? – Alain

4

के बाद से सामान्य संग्रह को लागू वस्तु आधारित इंटरफेस System.Collections नाम स्थान में परिभाषित किया गया है, तो आप ऐसा कर सकते हैं:

((System.Collections.IList) e.CollectionView.SourceCollection).Add(e.Item); 

बेशक प्रकार की जाँच अब क्रम में स्थानांतरित कर दिया है, तो आप यह सुनिश्चित करें कि e.Item होगा बनाने की जरूरत है सही प्रकार का हो, क्योंकि संकलक इसे कास्ट के बाद जांच नहीं सकते हैं।

1

आप एक विशिष्ट टाइप की गई कक्षा बना सकते हैं?

public class MyClass<ABC> 
    { 
     private void DataGridCollectionViewSource_CommittingNewItem(
       object sender, DataGridCommittingNewItemEventArgs e) 
     { 
      Type t = e.CollectionView.SourceCollection.GetType(); 

     if (t == typeof(List<ABC>)) 
     { 
      List<ABC> source = e.CollectionView.SourceCollection as List<ABC>; 
      source.Add(e.Item as ABC); 
     } 
    } 
} 

या नहीं आपके क्या करने की कोशिश कर रहा है की संदर्भ के आधार पर ....

1
void AddItem<T>(IEnumerable sourceCollection, object item) 
{ 
    ((List<T>)sourceCollectio).Add((T)item); 
} 
फिर

Type t = e.CollectionView.SourceCollection.GetType(); 
if (t == typeof(List<Person>)) { 
    AddItem<Person>(e.CollectionView.SourceCollection, e.Item); 
} else if (t == typeof(List<Place>)) { 
    AddItem<Place>(e.CollectionView.SourceCollection, e.Item); 
} 
संबंधित मुद्दे