5

私はこれが意味をなさないことを誓います。

これHttpRouteCollectionをWebAPIから取得した場合、特に、いくつかのカスタムルートタイプに基づいてフィルタリングしています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私が内部で行っていることを行っていませんか?

4

1 に答える 1

2

HostedHttpRouteCollectionが内部コレクションへの参照を処理する方法に問題があると思います。GetEnumeratorは、すでにHttpWebRouteタイプのルートのみを返します。

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

したがって、RouteTable.Routesからのすべてのルートで初期化されますが、それらすべてをIEnumerableとして返すわけではありません。

この場合、2番目の例で「機能する」と言うと、これは実際に期待するすべての項目を繰り返すことを意味するのでしょうか。実装を見て、あなたが投稿したものと同等のものを実行していると、私はそれが機能するとは思わないでしょう。

于 2013-01-05T20:41:53.823 に答える