private static Tuple<Type, Delegate, object[]> ToConstructorMiddlewareFactory(object middlewareObject, object[] args, ref Delegate middlewareDelegate)
{
Type middlewareType = middlewareObject as Type;
ConstructorInfo[] constructors = middlewareType.GetConstructors();
foreach (ConstructorInfo constructor in constructors)
{
ParameterInfo[] parameters = constructor.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;
}
ParameterExpression[] parameterExpressions = parameters.Select(p => Expression.Parameter(p.ParameterType, p.Name)).ToArray();
NewExpression callConstructor = Expression.New(constructor, parameterExpressions);
middlewareDelegate = Expression.Lambda(callConstructor, parameterExpressions).Compile();
return Tuple.Create(parameters[0].ParameterType, middlewareDelegate, args);
}
throw new MissingMethodException(middlewareType.FullName,
string.Format(CultureInfo.CurrentCulture, BuilderResources.Exception_NoConstructorFound, args.Length + 1));
}