public bool TryExecute(IContext context, Action next)
{
var req = context.Request;
var res = context.Response;
var path = req.Url.PathAndQuery;
var isMatch = PathTester.IsMatch(path);
if (isMatch)
{
var match = PathTester.Match(path);
var args = new string[Parameters.Length];
for (int i = 0; i < Parameters.Length; i++)
{
var parameterName = Parameters[i];
args[i] = Uri.UnescapeDataString(match.Groups[parameterName].Value);
}
var controller = (IController)Activator.CreateInstance(ControllerType);
controller.Request = req;
controller.Response = res;
controller.Context = context;
var typedController = Convert.ChangeType(controller, ControllerType);
var typedArgs = new object[args.Length + 1];
typedArgs[0] = next;
for (int i = 0; i < Parameters.Length; i++)
{
var paramKey = Parameters[i];
var arg = args[i];
var parameter = HandlerParameters[paramKey];
typedArgs[i + 1] = Convert.ChangeType(arg, parameter.ParameterType);
}
HandlerInfo.Invoke(typedController, typedArgs);
}
return isMatch;
}