2011-09-09 1 views
19

Quindi ho 2 classi denominate A e B.Assegnare dinamicamente metodo/metodo come variabile

A ha un metodo "public void Foo()".

B ha diversi altri metodi.

Quello che mi serve è una variabile in classe B, a cui verrà assegnato il metodo Foo() della classe A. Questa variabile dovrebbe in seguito essere "eseguita" (=> quindi dovrebbe eseguire il metodo assegnato di classe A) .

Come fare questo?

risposta

7

Reed ha dato la risposta giusta. Vale anche la pena sottolineare che è possibile utilizzare altre firme dei delegati oltre all'azione.

Non ci sono versioni generiche come Action<T> (uno arg), Action<T1, T2> (due args), ecc ... Anche se il metodo ha un tipo di ritorno, controlla Func<T, TResult>.

O, naturalmente, si può definire un tipo delegato.

48

Sembra che tu voglia utilizzare un delegate qui.

In sostanza, è possibile aggiungere, in classe "B":

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

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

È quindi possibile impostare:

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

Ciò stampare "Pippo", quindi "Bar".

+1

+1 per un chiaro esempio semplice – JohnD

+0

thx un sacco questo sta funzionando. mi mancava la parola chiave "Azione" :) – nr1

+1

@ nr1: In realtà ci sono molte opzioni - "Azione" ti permetterà di usare un metodo che non restituisce un valore e non accetta parametri. È possibile utilizzare 'Func ' se tutti i metodi accettano un int e restituiscono una stringa, ad esempio. –