C# 可枚举的类型<&燃气轮机;()未按预期使用路由收集

C# 可枚举的类型<&燃气轮机;()未按预期使用路由收集,c#,linq,linq-to-objects,C#,Linq,Linq To Objects,我发誓这毫无意义 鉴于我从Web API中获得了这个HttpRouteCollection,我将根据一些自定义路由类型进行过滤,特别是IAttributeRoute。我使用了httpRoutes.OfType(),但是循环的行为就像没有元素一样 需要明确的是,当这个循环被命中时,整个集合的类型是HttpAttributeRoute,它直接实现IAttributeRoute。此外,我在常规的RouteCollection上运行相同的循环 这不起作用: foreach (IAttributeRout

我发誓这毫无意义

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

需要明确的是,当这个循环被命中时,整个集合的类型是
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
(将来可能具有不同类型的路由)。这可能是一个因素吗


我是否遗漏了一些内容,或者不是类型为的
在做我内部正在做的事情?

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

public override IEnumerator<IHttpRoute> GetEnumerator()
{
    return (
        from httpWebRoute in this._routeCollection.OfType<HttpWebRoute>()
        select httpWebRoute.HttpRoute).GetEnumerator();
}
public覆盖IEnumerator GetEnumerator()
{
返回(
来自此中的httpWebRoute.\u routeCollection.OfType()
选择httpWebRoute.HttpRoute).GetEnumerator();
}
因此,虽然它使用RouteTable.routes中的所有路由进行初始化,但它不会将它们全部作为IEnumerable返回


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

Hmm,很有趣<类型为
的code>应执行强制转换,如果强制转换失败,则不会进行强制转换(即,它的工作方式与as运算符类似)。您可能只需要在linq查询中添加一个
。其中(r=>r!=null)
of type
使用
is
比较执行
foreach
循环,然后在满足上述条件的情况下执行
yield return
。您能给我们一些复制此行为的代码,以便我们可以处理它吗?有些事情我想尝试一下,看看会发生什么:
Routes.Cast()
Routes.AsEnumerable().OfType()
当然,我可以尝试制作一个示例。Cast可能现在就可以工作,因为每个路由都是属性路由,但可能不是未来的证明。我也会尝试使用
AsEnumerable
。我猜其中一个版本使用
IEnumerable.GetEnumerator
,另一个版本使用的是
IEnumerable.GetEnumerator
,它们在线路的某个地方重载。“它起作用”只是指我能够看到IATributterRoute的列表,并且在我快乐的路上,我只是不明白为什么会有不同,但这可以解释,不是吗?