2011-09-09 10 views
19

Mam dwie klasy o nazwach A i B.Dynamicznie przypisz metodę/metodę jako zmienną

A ma metodę "public void Foo()".

B ma kilka innych metod.

Potrzebna mi jest zmienna w klasie B, do której zostanie przypisana metoda Foo() klasy A. Zmienna ta powinna następnie zostać "wykonana" (=> więc powinna wykonać przypisaną metodę klasy A) .

Jak to zrobić?

Odpowiedz

7

Reed podał właściwą odpowiedź. Warto również podkreślić, że oprócz akcji można używać innych podpisów delegatów.

Istnieje generyczne wersje jak Action<T> (Arg), jeden (dwa Action<T1, T2> args), etc ... Również jeśli metoda ma typ zwracanej, sprawdź Func<T, TResult>.

Albo oczywiście można określić własny typ delegata.

48

Wygląda na to, że chcesz użyć tutaj delegate.

Zasadniczo, można dodać, w klasie "B":

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

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

Można wtedy ustawić:

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... 

Byłoby to wydrukować "foo", a następnie "bar".

+1

+1 dla jasnego, prostego przykładu. – JohnD

+0

thx dużo działa. Brakowało mi słowa "Akcja" :) – nr1

+1

@ nr1: W rzeczywistości jest tam wiele opcji - "Akcja" pozwoli ci użyć metody, która nie zwraca wartości i nie przyjmuje parametrów. Możesz użyć 'Func ' jeśli twoje metody przyjmują int i zwracają ciąg znaków, na przykład. –

Powiązane problemy