2011-09-09 11 views
19

したがって、私はAとBの2つのクラスを持っています。メソッド/メソッドを変数として動的に割り当てます。

Aのメソッドは "public void Foo()"です。

Bにはいくつかの方法があります。

クラスAのFoo()メソッドが割り当てられるクラスBの変数です。 この変数は後で "実行"する必要があります(=>クラスAの割り当てられたメソッドを実行する必要があります) 。

これを行う方法?

答えて

7

リードさんには正しい答えがありました。また、Action以外にも他の代理署名を使用できることを指摘する価値があります。

は、あなたのメソッドが戻り値の型を持っている場合などAction<T>(1つの引数)、Action<T1, T2>(2つの引数)、のような... はまた、Func<T, TResult>をチェックアウトし、一般的なバージョンがあります。

またはコースの独自のデリゲート型を定義することができます。

48

ここでdelegateを使用しているようです。

基本的には、クラス "B" には、追加することができます。

class B 
{ 
    public Action TheMethod { get; set; } 
} 

class A 
{ 
    public static void Foo() { Console.WriteLine("Foo"); } 
    public static void Bar() { Console.WriteLine("Bar"); } 
} 

は、あなたがそれから設定できます。これは、 "フー" し、 "バー" をプリントアウトでしょう

B b = new B(); 

b.TheMethod = A.Foo; // Assign the delegate 
b.TheMethod(); // Invoke the delegate... 

b.TheMethod = A.Bar; 
b.TheMethod(); // Invoke the delegate... 

+1

+1、明確で簡単な例 – JohnD

+0

これは多く働いています。 – nr1

+1

@ nr1:実際には多くのオプションがあります。「アクション」では、値を返さずパラメータを取らないメソッドを使用できます。あなたのメソッドがすべてintをとり、文字列を返すなら、 'Func 'を使うことができます。 –

関連する問題