在运行时之前不知道类型就抛出e.NewItems

时间:2016-03-05 18:06:42

标签: c# win-universal-app

所以我有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();
        }
    }

2 个答案:

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