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