コード例 #1
0
        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);
            }
        }