我发誓这没有意义。
假设我有这个来自Web API的HttpRouteCollection
,我基于一些自定义路由类型进行过滤,特别是IAttributeRoute
。我使用httpRoutes.OfType<IAttributeRoute>()
,但循环的行为就像没有元素。
要明确的是,当这个循环被击中时,整个集合都是直接实现IAttributeRoute
的HttpAttributeRoute
类型。此外,我有相同的循环在常规RouteCollection
上运行。
这行不通:
foreach (IAttributeRoute route in GlobalConfiguration.Configuration.Routes.OfType<IAttributeRoute>()) {
if (!string.IsNullOrWhiteSpace(route.RouteName) && !json.ContainsKey(route.RouteName)) {
json.Add(route.RouteName, "/" + route.Url);
}
}
然而,这工作得很好:
foreach (var route in GlobalConfiguration.Configuration.Routes)
{
if (route is IAttributeRoute) // uhhhh?
{
var r = route as IAttributeRoute;
if (!string.IsNullOrWhiteSpace(r.RouteName) && !json.ContainsKey(r.RouteName))
{
json.Add(r.RouteName, "/" + r.Url);
}
}
}
我发誓我没有说谎,它只在后面的代码中起作用。就像我说的,在正常的路线收集上这样做是可以的。正常的路由集合有其他类型,不仅仅是IAttributeRoute
,但是在当前状态下,HttpRouteCollection 只有有IAttributeRoute
(将来它可能有不同类型的路由)。这可能是一个因素吗?
我错过了什么或不是OfType
做什么我正在做的内部?
我猜这是HostedHttpRouteCollection处理其内部集合引用的方式的问题。GetEnumerator只返回已经是HttpWebRoute类型的路由:
public override IEnumerator<IHttpRoute> GetEnumerator()
{
return (
from httpWebRoute in this._routeCollection.OfType<HttpWebRoute>()
select httpWebRoute.HttpRoute).GetEnumerator();
}
所以,当它初始化为来自RouteTable的所有路由时。路由,它不会把它们全部作为IEnumerable返回。
既然如此,我想知道当你在第二个例子中说"它工作"时,这是否意味着它实际上迭代了你所期望的所有项?看看实现和运行等同于你发布的,我不认为它做。