15

クラス「KeyEvent」のメンバーの1つとしてこれを持っています:

private delegate void eventmethod();

そしてコンストラクタ:

public KeyEvent(eventmethod D) 
{
    D();
}

私がやりたいことは、そこで D() を呼び出す代わりに、そのメソッド (D) を KeyEvent のメンバー変数として格納したいので、次のようになります。

stored_method = D();

その後、KeyEvent の別のメソッドで、次のようにします。

stored_method();

これどうやってするの?

4

4 に答える 4

11

あなたはすでにほとんどコードを持っています。他のデータ型の場合と同様に、適切なデリゲート型のメンバー フィールドを作成し、パラメーターをそこに保存するだけです。

private eventmethod MySavedEvent;

public void KeyEvent(eventmethod D) {
    // Save the delegate
    MySavedEvent = D;
}

public void CallSavedEvent() {
    if (MySavedEvent != null) {
        MySavedEvent();
    }
}
于 2010-01-05T19:08:35.987 に答える
5

次のようなことができます:

private Action CallBackFunction {get; set;}

public KeyEvent(Action callback) {
   CallBackFunction = callback;
}

次の方法でインスタンス化できます。

new KeyEvent(MyFunction);

MyFunction は、そのクラスの関数の名前です

KeyEvent クラスは、次のようにその関数を呼び出すことができます。

CallBackFunction();

Action クラスでは厳密に型指定されたパラメーターを渡すこともでき、Func クラスは結果を返すメソッドに使用できます。

于 2010-01-05T19:14:01.463 に答える
2

あなたが望むものは「ファーストクラス関数」と呼ばれますhttp://en.wikipedia.org/wiki/First-class_function

C# は、バージョン 3 以降、無名関数とラムダ式をサポートしています。

Func<A,R>したがって、型 A の引数を取り、型 R の値を返す関数を表す which を使用できます。

ウィキから

static Func<double, double> MakeDerivative(Func<double, double> f, double deltaX)
  {
    return (x) => (f(x + deltaX) - f(x - deltaX)) / (2 * deltaX);
  }
于 2010-01-05T19:15:25.017 に答える
0
public class KeyEvent
{
  private eventmethod hurr;
  public KeyEvent(eventmethod D)
  {
    hurr = D;
  }
  public void SomeOtherMethod()
  {
    hurr();
  }
}

いくつかのことを組み合わせて... PascalCase 型/デリゲート/etc (EventMethod) と camelCase 引数 (d、dIsMyMethod)。フレームワークが提供するものを再利用します。 private Action hurr;

于 2010-01-05T19:09:19.587 に答える