Owin.Builder.AppBuilder.ToInstanceMiddlewareFactory C# (CSharp) Method

ToInstanceMiddlewareFactory() private static method

private static ToInstanceMiddlewareFactory ( object middlewareObject, object args ) : Tuple
middlewareObject object
args object
return Tuple
        private static Tuple<Type, Delegate, object[]> ToInstanceMiddlewareFactory(object middlewareObject, object[] args)
        {
            MethodInfo[] methods = middlewareObject.GetType().GetMethods();
            foreach (MethodInfo method in methods)
            {
                if (method.Name != Constants.Initialize)
                {
                    continue;
                }
                ParameterInfo[] parameters = method.GetParameters();
                Type[] parameterTypes = parameters.Select(p => p.ParameterType).ToArray();

                if (parameterTypes.Length != args.Length + 1)
                {
                    continue;
                }
                if (!parameterTypes
                    .Skip(1)
                    .Zip(args, TestArgForParameter)
                    .All(x => x))
                {
                    continue;
                }

                // DynamicInvoke can't handle a middleware with multiple args, just push the args in via closure.
                Func<object, object> func = app =>
                {
                    object[] invokeParameters = new[] { app }.Concat(args).ToArray();
                    method.Invoke(middlewareObject, invokeParameters);
                    return middlewareObject;
                };

                return Tuple.Create<Type, Delegate, object[]>(parameters[0].ParameterType, func, new object[0]);
            }
            return null;
        }