private static Tuple<Type, Delegate, object[]> ToGeneratorMiddlewareFactory(object middlewareObject, object[] args)
{
MethodInfo[] methods = middlewareObject.GetType().GetMethods();
foreach (MethodInfo method in methods)
{
if (method.Name != Constants.Invoke)
{
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;
}
IEnumerable<Type> genericFuncTypes = parameterTypes.Concat(new[] { method.ReturnType });
Type funcType = Expression.GetFuncType(genericFuncTypes.ToArray());
Delegate middlewareDelegate = Delegate.CreateDelegate(funcType, middlewareObject, method);
return Tuple.Create(parameters[0].ParameterType, middlewareDelegate, args);
}
return null;
}