我正在处理一个事件,该事件传递指向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);
有什么想法吗?
答案 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);
}