キャストされた結果を、 を受け取る関数に渡していますIList<Derived>
。
その時、あなたは自分で考案した痛みの世界にいます。私のアドバイスは、循環依存の問題を解決する他の方法を最初に見つけることです。あなたが発見したように、可能な実装が1つしかないインターフェイスにすべてを作成することは、その問題を解決するための苦痛な方法です。お勧めしません。
それができない場合は、問題のある関数を修正して、IList<IBase>
、 、IEnumerable<IBase>
または のいずれかを取るようにしますIEnumerable<Derived>
。できれば IEnumerable ソリューションの 1 つです。実際、リストを取るほとんどのメソッドは、シーケンスのみを必要とします。ここでリストが必要な理由を説明できれば、回避策を見つけるのに役立ちます。
IList<IBase>
orを取ることができればIEnumerable<IBase>
完了です。目的の型に暗黙的に変換できるものが既に手元にあります。
を取得できる場合は、IEnumerable<Derived>
(myListOfIBase.Cast<Derived>()
それらのすべてが Derived であることが本当にわかっているmyListOfIBase.OfType<Derived>()
場合) または (それらの一部が Derived 型ではない可能性があり、それらをスキップしたい場合) と言ってIEnumerable<Derived>
、効率的に使用する を取得できます。基礎となるリスト。
問題のある関数を変更できない場合は、基になるリストを効率的に使用する独自のクラスを作成できます。
sealed class MyProxyList : IList<Derived>
{
IList<IBase> underlyingList;
public MyProxyList(IList<IBase> underlyingList)
{
this.underlyingList = underlyingList;
}
... now implement every member of IList<Derived> as
... a call to underlyingList with a cast where necessary
}
そしてMyProxyList
、メソッドに new を渡します。