Controller类型的解析()
在如下所示的用于解析Controller类型的GetControllerType方法中从预先得到的所有Controller类型列表中筛选出类型名称与传入的Controller名称相匹配的类型首先通过路由对象的命名空间对之前得到的类型列表进行进一步筛选如果能够找到一个唯一的类型则直接将其作为Controller的类型返回为了确定是否采用后备命名空间对Controller类型进行解析可以从作为参数的RouteData对象中得到其DataTokens属性并从中获取路由变量UseNamespaceFallback的值如果该路由变量存在并且值为False则直接返回Null
public class ReflectedControllerFactory : IControllerFactory
{
//其他成员
protected virtual Type GetControllerType (RouteData routeData
string controllerName)
{
//根据类型名称筛选
var types = controllerTypesWhere(type => stringCompare(
controllerName + Controller typeName true) == )ToArray()
if (typesLength == )
{
return null;
}
//通过路由对象的命名空间进行匹配
var namespaces = routeDataDataTokens[Namespaces] as
IEnumerable<string>;
namespacesnamespaces = namespaces ?? new string[];
Type contrllerType = thisGetControllerType(namespaces types)
if (null != contrllerType)
{
return contrllerType;
}
//是否允许采用后备命名空间
bool useNamespaceFallback = true;
if (null != routeDataDataTokens[UseNamespaceFallback])
{
useNamespaceFallback =
(bool)(routeDataDataTokens[UseNamespaceFallback])
}
[] []