紧接着上篇asp.net mvc源码分析-Action篇 Filter 中提到了 IDictionary<string, object> parameters = GetParameterValues(controllerContext, actionDescriptor);首先这个方法的目的很明白获取当前Action参数名称和值得一个字典。
protected virtual IDictionary<string, object> GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) {
Dictionary<string, object> parametersDict = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
ParameterDescriptor[] parameterDescriptors = actionDescriptor.GetParameters();
foreach (ParameterDescriptor parameterDescriptor in parameterDescriptors) {
parametersDict[parameterDescriptor.ParameterName] = GetParameterValue(controllerContext, parameterDescriptor);
}
return parametersDict;
}
这个代码逻辑很简单吧,有前面的文章我们知道这里的actionDescriptor 是一个ReflectedActionDescriptor实例,我们猜测ParameterDescriptor是Paramete的一个包装类,具体返回应该是它的子类。 的GetParameters方法如下
public override ParameterDescriptor[] GetParameters() {
ParameterDescriptor[] parameters = LazilyFetchParametersCollection();
// need to clone array so that user modifications aren't accidentally stored
return (ParameterDescriptor[])parameters.Clone();
}
private ParameterDescriptor[] LazilyFetchParametersCollection() {
return DescriptorUtil.