private static bool ExecuteSteps([NotNull] ProcessorArgs args, [NotNull] IEnumerable <Step> steps, [CanBeNull] IPipelineController controller = null, bool startThisAndNestedProcessors = true) { Assert.ArgumentNotNull(args, nameof(args)); Assert.ArgumentNotNull(steps, nameof(steps)); using (new ProfileSection("Execute pipeline steps")) { ProfileSection.Argument("args", args); ProfileSection.Argument("steps", steps); ProfileSection.Argument("controller", controller); ProfileSection.Argument("startThisAndNestedProcessors", startThisAndNestedProcessors); foreach (Step step in steps) { ProcessorArgs innerArgs = null; /* Use args' member as args for nested pipeline*/ var argsName = step.ArgsName.EmptyToNull(); if (argsName != null) { Type type = args.GetType(); const BindingFlags Flags = BindingFlags.Instance | BindingFlags.NonPublic; FieldInfo field = type.GetField(argsName) ?? type.GetField(argsName, Flags); if (field != null) { innerArgs = (ProcessorArgs)field.GetValue(args); } else { PropertyInfo property = type.GetProperty(argsName) ?? type.GetProperty(argsName, Flags); if (property != null) { innerArgs = (ProcessorArgs)property.GetValue(args, new object[0]); } } Assert.IsNotNull(innerArgs, "Inner args are null, " + argsName); } startThisAndNestedProcessors = ExecuteProcessors(innerArgs ?? args, step._Processors, controller, startThisAndNestedProcessors); } return(startThisAndNestedProcessors); } }