2

多数のインターフェイスから継承する多数のクラスがあります。これらのクラスが実装しているインターフェースは、共通のメソッドを共有していませんが、共通の最初のステップを共有しています。これを示すのは次のとおりです。

クラス A は次のようになります。

class A : InterfaceA
{

    GetFoo(Database db)
    {
       PerformSetup(db); // This is the common first step.

       // Do foo things
    }
}

クラス B は次のようになります。

class B : InterfaceB
{
    GetBar(Database db)
    {
        PerformSetup(db); // This is the common first step.

        // Do bar things
    }
}

明らかに、メソッド PerformSetup を使用して基本クラスを作成し、これらすべてのメソッドでそれを呼び出すことができます。しかし、私の問題は、非常に多くのメソッドがあり、PerformSetup() への呼び出しがそれらすべてに含まれている必要があることですが、まだどのメソッドにも含まれていません。

したがって、そのセットアップ コードをすべてのメソッドの先頭にコピー アンド ペーストすることもできますが、DRY と自分の時間のために、このメソッドが任意のメソッドの前に自動的に呼び出されるようにする方法があるかどうか疑問に思っていました (可能な場合は公開のみ) メソッド呼び出し? どうにかしてイベントを利用できませんか?共通のインターフェイスを共有するクラスはなく、これらのインターフェイス メソッドの多くには Database パラメータに加えてパラメータがありますが、すべてのメソッドに database パラメータがあることに注意してください。

これはおそらく少し幻想的ですが、人々が C# でどのようなクレイジーな仕掛けを作成できるかを常に知りたいと思っています。

4

1 に答える 1

1

考えられる答えは 2 つあります。

  1. PostSharpを使用します。費用はかかりますが、効果はあると思います。
  2. メソッドを呼び出す前に、リフレクションを使用してメソッドを呼び出すことができPerformSetupます

基本的に、次の基本クラスを作成できます

class Base
{
    public void InvokeMethodWithSetup(string method, Database db, params object[] args)
    {
        PerformSetup(db);
        var method = this.GetType().GetMethod(method);
        method.Invoke(this, args);   
    }

    public void PerformSetup(Database db)
    {
        // stuff
    }
}

残念ながら、これは呼び出しコードを置き換えるためにメソッドの 1 つが呼び出されたすべての場所に移動することを意味するため、それがはるかに簡単になるかどうかはわかりませんが、少なくともすべてのメソッドを変更する必要がなくなります。

于 2013-08-08T21:24:04.480 に答える