Enumerable.OfType<>()在路由集合中没有按预期工作

本文关键字:工作 集合 路由 OfType Enumerable | 更新日期: 2023-09-27 17:49:14

我发誓这没有意义。

假设我有这个来自Web API的HttpRouteCollection,我基于一些自定义路由类型进行过滤,特别是IAttributeRoute。我使用httpRoutes.OfType<IAttributeRoute>(),但循环的行为就像没有元素。

要明确的是,当这个循环被击中时,整个集合都是直接实现IAttributeRouteHttpAttributeRoute类型。此外,我有相同的循环在常规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做什么我正在做的内部?

Enumerable.OfType<>()在路由集合中没有按预期工作

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

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

所以,当它初始化为来自RouteTable的所有路由时。路由,它不会把它们全部作为IEnumerable返回。

既然如此,我想知道当你在第二个例子中说"它工作"时,这是否意味着它实际上迭代了你所期望的所有项?看看实现和运行等同于你发布的,我不认为它做。