2012-02-27 17 views
10

Tôi đang xử lý một sự kiện vượt qua sự kiện arg trỏ đến một danh sách và một newitem T, và công việc của tôi là thêm newitem vào Danh sách.Làm thế nào để thêm một mục loại T vào Danh sách <T> mà không biết T là gì?

Tôi làm cách nào để thực hiện điều này mà không kiểm tra tất cả các loại tôi biết T có thể là?

Mã hiện nay là một vài chục dòng này:

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

Tôi muốn nếu có thể làm điều gì đó như thế này:

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

Bất kỳ ý tưởng?

Trả lời

16

Đơn giản chỉ cần không sử dụng Generics ở đây:

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

Bạn cũng có thể sử dụng ICollection ở vị trí của IList.

+0

'System.Collections.ICollection' không chứa một định nghĩa cho 'Thêm' - đó là lý do tại sao tôi đăng bài này ban đầu, nhưng tôi đã không cố gắng IList, mà một trong những công trình. Cảm ơn. – Alain

+0

@Alain ah, đủ công bằng - Tôi đã mất dấu các phương thức nào trong đó giao diện (iirc nó hơi khác nhau giữa các phiên bản không chung và chung) –

+0

Kiểm tra tính chính xác, có cách nào để xác minh rằng SourceCollection không có cùng loại với e.Item không? – Alain

4

Kể từ bộ sưu tập chung thực hiện các giao diện dựa trên đối tượng được định nghĩa trong namespace System.Collections, bạn có thể làm điều này:

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

Tất nhiên việc kiểm tra loại hiện đang chuyển sang thời gian chạy, vì vậy bạn cần phải chắc chắn rằng e.Item sẽ có kiểu đúng, vì trình biên dịch không thể kiểm tra nó sau khi truyền.

1

Bạn có thể tạo một lớp được nhập cụ thể?

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

hay không tùy thuộc vào bối cảnh những gì bạn đang cố gắng để làm ....

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

Sau đó

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); 
} 
Các vấn đề liên quan