2012-02-27 21 views
10

Obsługuję zdarzenie, które przekazuje argumenty zdarzeń wskazujące na listę i nowy wpis, a moje zadanie polega na dodaniu nowego elementu do listy.Jak dodać element typu T do listy <T>, nie wiedząc, co to jest T?

Jak mogę to zrobić bez sprawdzania wszystkich typów, jakie znam może być?

Obecny kod jest kilkadziesiąt wierszy to:

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

wolałbym gdyby to było możliwe, aby zrobić coś takiego:

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

jakieś pomysły?

Odpowiedz

16

Proszę nie używać rodzajowych tutaj:

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

Można również użyć ICollection zamiast IList.

+0

'System.Collections.ICollection' nie zawierają definicji "Dodaj" - dlatego to napisałem na początku, ale nie wypróbowałem ILista, ten działa. Dzięki. – Alain

+0

@Alain ah, dostatecznie jasny - straciłem informacje o tym, które metody są w interfejsie (iirc jest nieco inny w wersjach nietypowych i generycznych). –

+0

Jako sprawdzian poczytalności, czy istnieje sposób, w jaki mogę zweryfikować, że SourceCollection jest tego samego typu co e.Item? – Alain

4

Ponieważ zbiory ogólne wdrażanie interfejsów obiektów opartych zdefiniowane w przestrzeni nazw System.Collections, można to zrobić:

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

Oczywiście sprawdzanie typ jest teraz przesunięty do wykonywania, więc trzeba się upewnić, że e.Item będzie być poprawnym typem, ponieważ kompilator nie może go sprawdzić po zakończeniu rzutowania.

1

Można utworzyć określoną klasę maszynową?

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

lub nie w zależności od kontekstu, co próbujesz zrobić ....

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

Następnie

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); 
} 
Powiązane problemy