Delegados y reflexión.

09/01/2005 - 20:23 por Jose Antonio | Informe spam
He estado investigandoun poco sobre los delegados y mi impresión es que, a
parte de solucionar el tema de los eventos, sirven de muy poco si son
incapaces como asi es, de funcionar con metodos recogidos por reflexion de
la siguiente manera:

delegate void delegado();

public void metodo(){

// instrucciones del metodo
}

delegado d=new delegado(metodo):
d();


// hasta aqui todo perfecto, pero si el metodo lo cogemos por reflexion.

delegado d=new
delegado(Assembly.GetExecutingAsembly().GetType("Emsamblado").GetMethod("metodo"))

esto no compila, con lo cual si no sabes en tiempo de diseño como se llama
el metodo al que quieres llamar, los delegados no sirven de nada.

Preguntas similare

Leer las respuestas

#1 Miguel Ortiz Falcón
09/01/2005 - 23:27 | Informe spam
Mira te voy a dar mi punto de vista, yo creo que los
delegados son una característica muy potente de C#. Lo
que pasa que en ocasión puede ser un poco "laborioso"
trabajar con ellos. En el caso que presentas, bueno
realmente NO necesitas saber cómo se llama el método que
vas a llamar a través del delegado, es decir tu creas un
delegado X, este delegado tiene su firma no ?...el numero
de parámetros que tomará, el valor de retorno, y
entonces, el delegado podrá llamar a CUALQUIER método
llámese como se llame, el único requisito es que el
método a llamar tenga la misma firma que el delegado.

Y pues aparte otra muy buena capacidad de los delegados
es poder construir interface dinámicamente que responda a
eventos determinados.

Bueno, Saludos...

Miguel Ortiz Falcón



He estado investigandoun poco sobre los delegados y mi


impresión es que, a
parte de solucionar el tema de los eventos, sirven de


muy poco si son
incapaces como asi es, de funcionar con metodos


recogidos por reflexion de
la siguiente manera:

delegate void delegado();

public void metodo(){

// instrucciones del metodo
}

delegado d=new delegado(metodo):
d();


// hasta aqui todo perfecto, pero si el metodo lo


cogemos por reflexion.

delegado d=new
delegado(Assembly.GetExecutingAsembly().GetType


("Emsamblado").GetMethod("metodo"))

esto no compila, con lo cual si no sabes en tiempo de


diseño como se llama
el metodo al que quieres llamar, los delegados no sirven


de nada.




.

Respuesta Responder a este mensaje
#2 Octavio Hernandez
10/01/2005 - 00:16 | Informe spam
JA,

GetMethod() produce un objeto de tipo MethodInfo, que no es lo que espera el
constructor de un delegado.
Para llamar a un método a través de su MethodInfo tienes el método Invoke().

Yo diría que los delegados y la reflexión son dos mecanismos diferentes con
los que puedes lograr lo que tú quieres (llamadas indirectas), pero los
delegados son un mecanismo un poco más estático y la reflexión más dinámico.

En muchos casos (como los que indica Miguel), los delegados son más
adecuados. La reflexión te da la ultra-flexibilidad, a costa de eficiencia
en ejecución y seguridad de tipos.

Slds - Octavio

"Jose Antonio" escribió en el mensaje
news:
He estado investigandoun poco sobre los delegados y mi impresión es que, a
parte de solucionar el tema de los eventos, sirven de muy poco si son
incapaces como asi es, de funcionar con metodos recogidos por reflexion de
la siguiente manera:

delegate void delegado();

public void metodo(){

// instrucciones del metodo
}

delegado d=new delegado(metodo):
d();


// hasta aqui todo perfecto, pero si el metodo lo cogemos por reflexion.

delegado d=new
delegado(Assembly.GetExecutingAsembly().GetType("Emsamblado").GetMethod("metodo"))

esto no compila, con lo cual si no sabes en tiempo de diseño como se llama
el metodo al que quieres llamar, los delegados no sirven de nada.




Respuesta Responder a este mensaje
#3 Tomas Restrepo \(MVP\)
10/01/2005 - 15:15 | Informe spam
Jose Antonio,

He estado investigandoun poco sobre los delegados y mi impresión es que, a
parte de solucionar el tema de los eventos, sirven de muy poco si son
incapaces como asi es, de funcionar con metodos recogidos por reflexion de
la siguiente manera:

delegate void delegado();

public void metodo(){

// instrucciones del metodo
}

delegado d=new delegado(metodo):
d();


// hasta aqui todo perfecto, pero si el metodo lo cogemos por reflexion.

delegado d=new



delegado(Assembly.GetExecutingAsembly().GetType("Emsamblado").GetMethod("met
odo"))

esto no compila, con lo cual si no sabes en tiempo de diseño como se llama
el metodo al que quieres llamar, los delegados no sirven de nada.



Si lo puedes hacer, pero estas haciendolo de manera. Lo que necesitas hacer
es obtener el MethodInfo para el metodo sobre el que esperas crear el
delegado:

MethodInfo method Assembly.GetExecutingAsembly().GetType("Emsamblado").GetMethod("metodo");

Con el MethodInfo, puedes usar Delegate.CreateDelegate():

delegado d = Delegate.CreateDelegate(typeof(delegado), method);

Tomas Restrepo

Respuesta Responder a este mensaje
#4 Octavio Hernandez
10/01/2005 - 23:10 | Informe spam
Tomas,

Muy buena observación, en esto no había caído... Este mecanismo "cierra el
círculo" entre los delegados y la reflexión.

Slds - Octavio

"Tomas Restrepo (MVP)" escribió en el mensaje
news:%
Jose Antonio,

He estado investigandoun poco sobre los delegados y mi impresión es que,
a
parte de solucionar el tema de los eventos, sirven de muy poco si son
incapaces como asi es, de funcionar con metodos recogidos por reflexion
de
la siguiente manera:

delegate void delegado();

public void metodo(){

// instrucciones del metodo
}

delegado d=new delegado(metodo):
d();


// hasta aqui todo perfecto, pero si el metodo lo cogemos por reflexion.

delegado d=new



delegado(Assembly.GetExecutingAsembly().GetType("Emsamblado").GetMethod("met
odo"))

esto no compila, con lo cual si no sabes en tiempo de diseño como se
llama
el metodo al que quieres llamar, los delegados no sirven de nada.



Si lo puedes hacer, pero estas haciendolo de manera. Lo que necesitas
hacer
es obtener el MethodInfo para el metodo sobre el que esperas crear el
delegado:

MethodInfo method > Assembly.GetExecutingAsembly().GetType("Emsamblado").GetMethod("metodo");

Con el MethodInfo, puedes usar Delegate.CreateDelegate():

delegado d = Delegate.CreateDelegate(typeof(delegado), method);

Tomas Restrepo



Respuesta Responder a este mensaje
#5 Jose Antonio
11/01/2005 - 20:53 | Informe spam
Gracias por los puntos de vista y por la solución.

Saludos
"Tomas Restrepo (MVP)" escribió en el mensaje
news:%
Jose Antonio,

He estado investigandoun poco sobre los delegados y mi impresión es que,
a
parte de solucionar el tema de los eventos, sirven de muy poco si son
incapaces como asi es, de funcionar con metodos recogidos por reflexion
de
la siguiente manera:

delegate void delegado();

public void metodo(){

// instrucciones del metodo
}

delegado d=new delegado(metodo):
d();


// hasta aqui todo perfecto, pero si el metodo lo cogemos por reflexion.

delegado d=new



delegado(Assembly.GetExecutingAsembly().GetType("Emsamblado").GetMethod("met
odo"))

esto no compila, con lo cual si no sabes en tiempo de diseño como se
llama
el metodo al que quieres llamar, los delegados no sirven de nada.



Si lo puedes hacer, pero estas haciendolo de manera. Lo que necesitas
hacer
es obtener el MethodInfo para el metodo sobre el que esperas crear el
delegado:

MethodInfo method > Assembly.GetExecutingAsembly().GetType("Emsamblado").GetMethod("metodo");

Con el MethodInfo, puedes usar Delegate.CreateDelegate():

delegado d = Delegate.CreateDelegate(typeof(delegado), method);

Tomas Restrepo



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida