Article
、BlogPost
、およびの 3 つの主要なタイプの「オンライン ニュース出版物」を含むサイトを構築していますColumnPost
。サイト全体に、これらのリストを出力するさまざまなコントロールがあり、一緒に混合したり、混合したりしません。したがって、多くのコントロールには記事のリストがあり、他のコントロールにはブログ投稿とコラム投稿のリストがあります。いくつかの場所では、記事、ブログ投稿、およびコラム投稿のリストさえ持っています。そこで、 という 3 つすべてのラッパー クラスを作成しましたPublication
。私の以前のクラスは次のように継承されました:
BasePage : System.Web.UI.Page
Article : BasePage
BlogPost : BasePage
ColumnPost : BasePage
many other pages types : BasePage
私の新しいPublication
ラッパーでは、次のようになります。
BasePage : System.Web.UI.Page
Publication : BasePage
Article : Publication
BlogPost : Publication
ColumnPost : Publication
今、私はこのようなことができます:
var dataSource = new List<Publication>();
articlesForThisControl().ForEach(a => dataSource.Add(a));
blogPostsForThisControl().ForEach(bp => dataSource.Add(bp));
columnPostsForThisControl().ForEach(cp => dataSource.Add(cp));
... dataSource.SortByDate() ...
さらに、C# のメディエーター パターンを使用して、重複するデータを必要とする可能性のある多くの競合するコントロールを仲介しています。以前は を持ってArticleMediator
いましたが、代わりに に変更しましたPublicationMediator
。
私の質問:
基本クラスのリストから派生クラスのリストを取得する最良/最も簡単な方法は何ですか? したがって、私のメディエーターは基本的に a を受け取り、 aList<Publication>
を返しますList<Publication>
。リスト内のすべてが であることがわかっている場合、Article
それを元に戻して としてキャストする簡単な方法は何List<Article>
ですか? 現在、私は多くのコードのように見える次のことを行っていますが、これが私がすべき方法であれば、私は大丈夫です。もっと簡単な方法があるかどうか疑問に思っています:
List<Article> articles = new List<Article>();
PublicationMediator.CalculateResults();
PublicationMediator.GetResults(this.UniqueID).PublicationList.Where(p => p is Article).ToList().ForEach(p => articles.Add((Article)p));
PublicationList
プロパティは、List<Publication>
メディエータが現在のコントロールの使用を許可することを決定したことを返します。ただし、必要なのは だけであることはわかっているので、リスト内のList<Article>
それぞれを調べて、それが であることを確認してから、それを実際の に追加する必要があります。これを行う簡単な方法はありますか?Publication
Article
List<Article>
メディエーターが a を返すように変更したくない理由はList<Article>
、場所によっては両方が必要なためBlogPost
、実際にはリピーターを aにColumnPost
バインドする必要があり、現在のアイテムがまたはであるかどうかを確認できるからです。List<Publication>
ItemDataBound
BlogPost
ColumnPost
アップデート
私は受け入れられた答えを取り、それを拡張機能にしました:
public static List<T> GetSublist<T>(this List<Publication> publications) where T : Publication {
return publications.OfType<T>().ToList<T>();
}