public override void ChangeEdge(TEdge sinkEdge, TItem newItem, bool changeRoot) { Func <TItem> getItem = () => changeRoot ? sinkEdge.Root : sinkEdge.Leaf; Action <TItem> setItem = item => { if (changeRoot) { sinkEdge.Root = item; } else { sinkEdge.Leaf = item; } }; var itemBefore = getItem(); Source.ChangeEdge(sinkEdge, newItem, changeRoot); var lockObj = (object)sinkEdge; lock (lockObj) { // revert the changes, otherwise edge is not removed from Sink.Edges(itemBefore) setItem(itemBefore); Sink.ChangeEdge(sinkEdge, newItem, changeRoot); // ensure the changes are done if (!object.Equals(getItem(), newItem)) { setItem(newItem); } } }
public override void ChangeEdge(TSinkEdge sinkEdge, TSinkItem newItem, bool changeRoot) { var source = Get(sinkEdge); Sink.ChangeEdge(sinkEdge, newItem, changeRoot); if (source != null) { var sourceEdge = (TSourceEdge)source; var newSourceEdge = Mapper.TryGetCreate(newItem); Source.ChangeEdge(sourceEdge, newSourceEdge, changeRoot); } }