如何将类型为T的项目添加到列表<;T>;而不知道T是什么

本文关键字:lt gt 是什么 不知道 列表 添加 类型 项目 | 更新日期: 2023-09-27 18:25:52

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

如果不检查我所知道的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);

有什么想法吗?

如何将类型为T的项目添加到列表<;T>;而不知道T是什么

这里不要使用泛型:

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

您也可以使用ICollection来代替IList

由于泛型集合实现了在System.Collections命名空间中定义的基于对象的接口,因此可以执行以下操作:

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

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

您可以创建一个特定类型的类吗?

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

或者不取决于你尝试做什么的上下文…

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