public object Invoke(Controller controller, ActionInvocation action)
{
ParameterInfo[] parameters = _actionMethod.GetParameters();
object[] parameterValues = null;
if (parameters.Length != 0) {
List<object> parameterList = new List<object>(parameters.Length);
int paramIndex = 0;
for (; paramIndex < action.Parameters.Count && paramIndex < parameters.Length; paramIndex++) {
parameterList.Add(action.Parameters[paramIndex]);
}
for (; paramIndex < parameters.Length; paramIndex++) {
string paramName = parameters[paramIndex].Name;
string paramValue = null;
action.NamedParameters.TryGetValue(paramName, out paramValue);
parameterList.Add(paramValue);
}
for (int i = 0; i < parameterList.Count; i++) {
Type parameterType = parameters[i].ParameterType;
object paramValue = parameterList[i];
if ((paramValue == null) || (parameterType.IsAssignableFrom(paramValue.GetType()) == false)) {
paramValue = Convert.ChangeType(paramValue, parameterType, CultureInfo.CurrentCulture);
parameterList[i] = paramValue;
}
}
parameterValues = parameterList.ToArray();
}
return _actionMethod.Invoke(controller, parameterValues);
}