【问题标题】:Enumerable.OfType<>() not working as expected with route collectionEnumerable.OfType<>() 在路由集合中没有按预期工作
【发布时间】:2012-12-23 03:45:38
【问题描述】:

我发誓这没有意义。

鉴于我有来自 Web API 的 HttpRouteCollection,我正在根据一些自定义路由类型进行过滤,特别是 IAttributeRoute。我使用httpRoutes.OfType&lt;IAttributeRoute&gt;(),但循环的行为就像没有元素一样。

需要明确的是,当这个循环被命中时,整个集合都是HttpAttributeRoute 类型,它直接实现IAttributeRoute。此外,我在常规 RouteCollection 上运行 same 循环。

这不起作用:

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 没有做我在内部做的事情?

【问题讨论】:

  • 嗯,很有趣。 OfType 应该执行一次转换并且如果转换失败不会抛出(即它的工作方式类似于 as 运算符)。您可能只需要在 linq 查询中添加 .Where( r =&gt; r != null )
  • OfType 执行foreach 循环,在满足上述条件的情况下进行is 比较,然后是yield return
  • 你能给我们一些重现这种行为的代码,以便我们解决它吗?有些事情我想尝试一下,看看会发生什么:Routes.Cast&lt;IAttributeRoute&gt;()Routes.AsEnumerable().OfType&lt;IAttributeRoute&gt;()
  • 当然,我可以尝试制作一个样本。 Cast 可能现在可以工作,因为每条路线都是一个属性路线,但可能不是面向未来的。我也会试试AsEnumerable
  • 我的猜测是一个版本使用IEnumerable.GetEnumerator 和另一个IEnumerable&lt;T&gt;.GetEnumerator 沿线某处过载。

标签: c# linq linq-to-objects


【解决方案1】:

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

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

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

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

【讨论】:

  • “它有效”仅指我能够看到 IAttributeRoute 路线列表并在我快乐的路上,我只是对为什么会有差异感到困惑,但这可以解释它,不是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 2011-08-30
  • 2014-05-02
  • 2019-08-08
  • 2018-04-06
  • 2016-08-19
相关资源
最近更新 更多