public static bool IsItemInSequence(this ModelItem item, out ModelItem sequence) { if (null == item) { throw FxTrace.Exception.AsError(new ArgumentNullException("item")); } bool result = false; int level = 0; Func <ModelItem, bool> isInSequencePredicate = (p) => { switch (level) { case 0: ++level; return(p is ModelItemCollection); case 1: ++level; result = typeof(Sequence).IsAssignableFrom(p.ItemType); return(result); default: return(false); } ; }; ModelItem container = item.GetParentEnumerator(isInSequencePredicate).LastOrDefault(); sequence = result ? container : null; return(result); }
public static bool IsItemInFlowchart(this ModelItem item, out ModelItem flowchart, out ModelItem flowStep) { if (null == item) { throw FxTrace.Exception.AsError(new ArgumentNullException("item")); } bool result = false; int level = 0; ModelItem flowStepContainer = null; flowchart = null; flowStep = null; Func <ModelItem, bool> isInFlowchartPredicate = (p) => { switch (level) { case 0: ++level; flowStepContainer = typeof(FlowStep).IsAssignableFrom(p.ItemType) ? p : null; return(null != flowStepContainer); case 1: ++level; return(p is ModelItemCollection); case 2: ++level; result = (typeof(Flowchart).IsAssignableFrom(p.ItemType)); return(result); default: return(false); } }; ModelItem container = item.GetParentEnumerator(isInFlowchartPredicate).LastOrDefault(); if (result) { flowchart = container; flowStep = flowStepContainer; } return(result); }