如何在不知道T是什么的情况下将类型T的项添加到List <t>?</t>

时间:2012-02-27 16:02:01

标签: c# wpf generics .net-4.0

我正在处理一个事件,该事件传递指向List和T newitem的事件args,我的工作是将newitem添加到List。

如果不检查我可能知道的所有类型,我怎么能这样做呢?

目前的代码是几十行:

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

有什么想法吗?

4 个答案:

答案 0 :(得分:16)

这里不要使用泛型:

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

您也可以使用ICollection代替IList

答案 1 :(得分:4)

由于泛型集合实现了System.Collections命名空间中定义的基于对象的接口,因此您可以这样做:

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

当然,类型检查现在转移到运行时,因此您需要确保e.Item的类型正确,因为编译器在转换后无法检查它。

答案 2 :(得分: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);
        }
    }
}

或不取决于您尝试做的事情的背景....

答案 3 :(得分: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);
}