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;
}