public UnionCollection(IReadOnlyCollection <T1> source, Expander <T1, T2> expander) { Contract.IsNotNull(source); Contract.IsNotNull(expander); _expander = expander; _src = source; _addSource = new EventReceiver <ObjectEventArgs>((x, y) => this.OnAdd((T1)y.Arg)); _removeSource = new EventReceiver <ObjectEventArgs>((x, y) => OnRemove((T1)y.Arg)); _resetSource = new EventReceiver((x, y) => ReloadAll()); _addItem = new EventReceiver <ObjectEventArgs>((x, y) => this.OnAddItem((T2)y.Arg)); _removeItem = new EventReceiver <ObjectEventArgs>((x, y) => this.OnRemoveItem((T2)y.Arg)); _resetItems = new EventReceiver((x, y) => ResetSource((IReadOnlyCollection <T2>)x)); _src.Added.AddReceiver(_addSource); _src.Removed.AddReceiver(_removeSource); _src.Reset.AddReceiver(_resetSource); _resetSource.Ping(); }