私は、繰り返し実行して各項目に対していくつかのコードを実行する必要があるIEnumerableを持っている状況があります。サードパーティクラスへの多態的な拡張
このコードは実際の項目の種類に依存しますが、私が探しているのは、条件付きでなくてもこれを行うきれいな方法です。新しいハンドラを作成して既存のコードを変更する必要はありません。私はを作成しようとした
void Execute(IEnumerable<BaseObject> list)
{
foreach (var item in list)
item.DoWork();
}
:
public abstract class BaseObject{ }
public class Derived1: BaseObject { }
public class Derived2 : BaseObject { }
と私の地元のコードは次のようなものを行います。
は、私がサードパーティのライブラリは、以下のコードが含まれている例があり、これを説明するために、拡張メソッドこれを行うには:public static class Extensions
{
public static int DoWork(this BaseObject obj) { return 0; }
public static int DoWork(this Derived1 obj) { return 1; }
public static int DoWork(this Derived2 obj) { return 2; }
}
列挙の各項目がBaseObject型であるため、明らかに機能しないため、0を返す拡張メソッドが常に呼び出されます。
void Execute(IEnumerable<BaseObject> list)
{
foreach (var item in list)
{
var local = item as IMyInterface;
local?.DoWork();
}
}
:
新しいインターフェイスから
public class MyDerived1: Derived1, IMyInterface
{
public int DoWork(){return 1;}
}
public class MyDerived2: Derived2, IMyInterface
{
public int DoWork(){return 2;}
}
public interface IMyInterface
{
int DoWork();
}
が、私は反復可能性があり、キャスト:
私はインターフェイスを実装する各派生型のすべてののための新しい派生型を作成するオプションを持っています
しかし、これには派生した型の構築が必要であり、どの型を構築するかの決定には、条件付きの文が必要です。新しいタイプが追加されました。
明らかにここでは工場パターンを使用していますが、私がこれまでに持っている最もクリーンなソリューションです。
、誰もがそれだろうなアプローチを提案することができます...
をコマンドパターンがソリューションを提供していますが、実行するコマンドは、派生型の種類に依存しているように、条件がまだこのコマンドを構築するために必要とされます新しい派生型がミックスに追加されたときに変更する必要がある条件を完全に排除しますか?
あなたはあなたの工場は、任意の条件文を必要とせずに右の派生型を構築できるようになるリフレクションを使用して、起動時に辞書を構築することができ、そしてマップが自動的に修正を必要とせずに追加された新しい派生型が含まれるであろう。 – Baldrick
@Baldrickに感謝します。これはこの記事の答えで取られたアプローチです。http://stackoverflow.com/questions/27724130/simulate-inheritance-by-extension正直言って私は反射を避けるために探していた。 – MikeW
私はそれが可能であるかどうかはわかりません。 (a)オーバーライドされたメソッドへのオブジェクト自体の仮想メソッド呼び出し(ただし、サードパーティ製であり、変更することはできません)、または(b )を反映し、次に条件文を使用します。あなたの状況に別の方法があるかどうかはわかりません。 – Baldrick