5

我发誓这没有意义。

鉴于我HttpRouteCollection从 Web API 获得了这个,我正在根据一些自定义路由类型进行过滤,特别是IAttributeRoute. 我使用httpRoutes.OfType<IAttributeRoute>()但循环的行为就像没有元素一样。

需要明确的是,当这个循环被命中时,整个集合都是HttpAttributeRoute直接实现的类型IAttributeRoute。此外,我在常规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做我在内部做的事情?

4

1 回答 1

2

我猜这是 HostedHttpRouteCollection 处理对其内部集合的引用的方式的问题。GetEnumerator 仅返回 HttpWebRoute 类型的路由:

public override IEnumerator<IHttpRoute> GetEnumerator()
{
    return (
        from httpWebRoute in this._routeCollection.OfType<HttpWebRoute>()
        select httpWebRoute.HttpRoute).GetEnumerator();
}

因此,虽然它使用来自 RouteTable.Routes 的所有路由进行初始化,但它不会将它们全部返回为 IEnumerable。

既然如此,我想知道当您在第二个示例中说“它有效”时,这是否意味着它实际上迭代了您期望的所有项目?查看实现并运行与您发布的等效内容,我认为它不会。

于 2013-01-05T20:41:53.823 回答