Enumerable.OfType<>()无法按预期使用路由集合

时间:2012-12-23 03:45:39

标签: c# linq linq-to-objects

我发誓这没有意义。

鉴于我有来自Web API的HttpRouteCollection,我基于一些自定义路由类型进行过滤,特别是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做我在内部做的事情吗?

1 个答案:

答案 0 :(得分:2)

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

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

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

在这种情况下,我想知道你在第二个例子中说“它是否有效”,这是否意味着它实际上会迭代你期望的所有项目?查看实现并运行与您发布的内容等效的内容,我认为不会这样做。