2012-02-27 12 views
10

Olay listelerini bir List'e ve bir T newitem'e işaret eden bir olayı ele alıyorum ve işim yeni listeyi Listeye eklemek.T'nin ne olduğunu bilmeden <T> listesine T türü bir öğe nasıl eklenir?

Bunu, T olabileceğimi bildiğim tüm türleri denetlemeden nasıl yapabilirim?

geçerli kod bu birkaç düzine hatları:

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); 
    } 
    ... 

böyle bir şey yapmak mümkün olsaydı ben tercih ediyorum:

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

Herhangi bir fikir?

cevap

16

Basitçe burada jenerikleri kullanmayın: Ayrıca IList yerine ICollection kullanabilirsiniz

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

. jenerik koleksiyonları System.Collections ad alanında tanımlanan nesne tabanlı arayüzler uygulamak yana

+0

'System.Collections.ICollection' için bir tanım içermiyor 'Ekle' - bu yüzden başlangıçta bunu yayınladım, fakat IList'i denemedim, bu işe yaradı. Teşekkürler. – Alain

+0

@Alain ah, yeterince adil - Hangi yöntemlerin hangi arabirimde olduğunu (örneğin, genel olmayan ve genel olmayan sürümler arasında biraz farklı) izledim. –

+0

Bir akıl sağlığı denetimi olarak, Kaynak Kodunun doğrulanabildiğini doğrulamak için bir yol var mı e.Item ile aynı tipte mi? – Alain

4

, bunu yapabilirsiniz: tip kontrolü artık çalışma süresiyle kaymıştır, bu nedenle e.Item olur emin olmak için ihtiyaç olan Elbette

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

Doğru tipte olmak, çünkü derleyici dökümden sonra kontrol edemez.

1

Belirli bir sınıf yazabilirsiniz?

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); 
     } 
    } 
} 

ya da değil senin yapmaya çalışıyor ne bağlamına göre .... Sonra

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); 
} 
İlgili konular