所以我有6个集合改变了事件处理程序,并意识到我需要摆脱这个重复的代码。它们之间的唯一区别是Cast中的类型。
e.NewItems.Cast<MyClass>().ForEach(l => l = //stuff);
由于NewItems是一个IList,我找到了一种获取集合类型的方法,我想在Cast中使用它。
var t = sender.GetType().GetGenericArguments().FirstOrDefault().GetType();
问题是我不能在类型括号中使用变量&lt;&gt;演员。我能以任何方式做到这一点或做一些能完成同样事情的事情吗?
编辑:
private void Profiles_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
e.NewItems.Cast<Profile>().ForEach(l => PerformOperation(l, DatabaseOperation.Add, false));
e.NewItems.Cast<Profile>().ForEach(l => l.PropertyChanged += OnPropertyChanged);
break;
case NotifyCollectionChangedAction.Move:
break;
case NotifyCollectionChangedAction.Remove:
e.OldItems.Cast<Profile>().ForEach(l => PerformOperation(l, DatabaseOperation.Remove, false));
e.OldItems.Cast<Profile>().ForEach(l => l.PropertyChanged -= OnPropertyChanged);
break;
case NotifyCollectionChangedAction.Replace:
break;
case NotifyCollectionChangedAction.Reset:
break;
default:
throw new ArgumentOutOfRangeException();
}
}
答案 0 :(得分:1)
通用函数怎么样?
public void YourMethod (IList<T> yourList)
{
yourList.ForEach(l => l = //stuff);
}
答案 1 :(得分:1)
我并不完全清楚你要做什么,但听起来你可以编写一个接口或基类。这样你就可以做到:
e.NewItems.Cast<IMyClass>().ForEach(l => l //stuff);
或
e.NewItems.Cast<MyBaseClass>().ForEach(l => l //stuff);