2011-09-09 18 views
19

Tengo 2 clases llamadas A y B.Asignación dinámica de método/Método como variable

A tiene un método "public void Foo()".

B tiene varios otros métodos.

Lo que necesito es una variable en la clase B, que se le asignará el método Foo() de la clase A. Esta variable se debe "ejecutar" (=> entonces debe ejecutar el método asignado de la clase A) .

¿Cómo hacer esto?

Respuesta

7

Reed le dio la respuesta correcta. También vale la pena señalar que puede usar otras firmas delegadas además de Acción.

Hay versiones genéricas como Action<T> (uno arg), Action<T1, T2> (dos args), etc ... Además, si su método tiene un tipo de retorno, echa un vistazo a Func<T, TResult>.

O, por supuesto, se puede definir su propio tipo de delegado.

48

Parece que quiere usar un delegate aquí.

Básicamente, se puede añadir, en la clase "B":

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

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

entonces se podría establecer:

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

Esto imprimiría "Foo" y luego "bar".

+1

+1 para un ejemplo claro, simple – JohnD

+0

thx mucho esto está funcionando. me faltaba la palabra clave "Acción" :) – nr1

+1

@ nr1: en realidad, hay muchas opciones allí: 'Action' le permitirá usar un método que no devuelve un valor y no toma ningún parámetro. Puede usar 'Func ' si todos sus métodos toman un int y devuelven una cadena, por ejemplo. –

Cuestiones relacionadas