在CodePlex 上的源代码System.Web.Mvc.RouteCollectionExtensions
和在我的本地 GAC 上运行一点ILSpy 之间System.Web.Routing.RouteCollection
,似乎没有区别,尽管它们似乎有完全独立的代码来做同样的事情。
RouteCollection.IgnoreRoute
(通过CodePlex 源)
public static void IgnoreRoute(this RouteCollection routes, string url, object constraints) {
if (routes == null) {
throw new ArgumentNullException("routes");
}
if (url == null) {
throw new ArgumentNullException("url");
}
IgnoreRouteInternal route = new IgnoreRouteInternal(url) {
Constraints = new RouteValueDictionary(constraints)
};
routes.Add(route);
}
RouteCollection.Ignore
(通过 ILSpy 反编译)
public void Ignore(string url, object constraints) {
if (url == null) {
throw new ArgumentNullException("url");
}
RouteCollection.IgnoreRouteInternal item = new RouteCollection.IgnoreRouteInternal(url) {
Constraints = new RouteValueDictionary(constraints)
};
base.Add(item);
}
差异
唯一真正的区别是位置的明显区别,一个是RouteCollection
类本身的实例方法,一个是该类的扩展方法。在考虑了来自实例与扩展执行的代码差异(例如对扩展实例进行重要的空检查)之后,它们看起来是相同的。
在它们的核心,它们都使用完全相同的StopRoutingHandler
类。两者都有自己的密封IgnoreRouteInternal
类版本,但这些版本在代码上是相同的。
private sealed class IgnoreRouteInternal : Route {
public IgnoreRouteInternal(string url)
: base(url, new StopRoutingHandler()) {
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary routeValues) {
return null;
}
}