如何将类型为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);
有什么想法吗?
这里不要使用泛型:
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);
}