Delegados y Reflection

17/11/2008 - 23:30 por Maria | Informe spam
Hola, estoy haciendo una clase que tiene por objetivo actuar como delivery.
Debe ejecutar métodos que están sobrecargados en una clase. Dependiendo de la
opción debe ejecutar uno u otro.
No logro enlazar el método delegado. Me da el error: El valor no puede ser
nulo.
Nombre del parámetro: method; o el error: Error al enlazar con el método de
destino.


La clase es la siguiente:
public delegate int Delegado(Object[] args);
public class cDelivery
{

public cDelivery(){ }

#region Empleados
public int Add_Empleado(cGG_EMPLEADOS obj, int modulo)
{
cGG_EMPLEADOS Empleado = new cGG_EMPLEADOS();

//Obtengo el método
Type TipoEmpleado = Type.GetType("cGG_EMPLEADOS");
BindingFlags flags = BindingFlags.Public | BindingFlags.Static;
MethodInfo Metodo = typeof(cGG_EMPLEADOS).GetMethod("Agr",flags);
//Quitando el parametro flags me da el error: Error al enlazar con el método
de destino.
Object[] args;

//Delego el método
//Delegado Delivery =
(Delegado)Delegate.CreateDelegate(typeof(Delegado), Metodo);
//Delegate Delivery = Delegate.CreateDelegate(typeof(Delegado),
null, Metodo, false);
//Delegate Delivery = Delegate.CreateDelegate(typeof(Delegado),
Metodo);
Delegado delegado =
(Delegado)Delegate.CreateDelegate(typeof(Delegado), Metodo);//Aqui arroja el
error

int _rta = 0;
if (delegado != null)
{
//Direcciono según el módulo

switch (modulo)
{
case 1:
args = new Object[] { (int)0, (string)obj.nombre,
(string)obj.apellido, (int?)obj.id_pais, (int?)obj.id_provincia,
(int?)obj.id_localidad, (string)obj.direccion, (string)obj.dni,
(string)obj.tel, (string)obj.cel, (string)obj.email, (int?)obj.id_sector,
(string)obj.observaciones, (object)obj.id_usuario,
(DateTime?)obj.fecha_alta_reg };
_rta = delegado(args);
break;
case 2:
args = new Object[] { (int)0, (string)obj.nombre,
(string)obj.apellido, (int?)obj.id_pais, (int?)obj.id_provincia,
(int?)obj.id_localidad, (string)obj.direccion, (string)obj.dni,
(string)obj.tel, (string)obj.cel, (string)obj.email, (int?)obj.id_sector,
(string)obj.observaciones, (object)obj.id_usuario,
(DateTime?)obj.fecha_alta_reg };
_rta = delegado(args);
break;
}
}
return _rta;
}
#endregion
}

Alguna idea, me estoy olvidando de algo.
Muchas gracias

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
18/11/2008 - 07:42 | Informe spam
"Maria" wrote in message
news:
No logro enlazar el método delegado. Me da el error: El valor no puede ser
nulo. Nombre del parámetro: method; o el error: Error al enlazar con
el método de destino.



El primer error ("El valor no puede ser nulo. Nombre del parámetro:
method") ocurre si el method es null, cosa que a su vez ocurre si no existe
el método cuando lo buscas con la sentencia:
MethodInfo Metodo = typeof(cGG_EMPLEADOS).GetMethod("Agr",flags);



La razón de que no lo encuentre puede ser porque la clase cGG_EMPLEADOS
no contenga un método "Agr", o porque las características de dicho método no
coincidan con las especificadas en "flags". Ah, y si el método tiene varias
sobrecargas tienes que especificar cuál de ellas estás buscando, indicando
los tipos de los argumentos mediante el parámetro Type[] que tiene una de
las sobrecargas de GetMethod.

El segundo error ("Error al enlazar con el método de destino.") te puede
ocurrir porque al ejecutar esta sentencia:
Delegado delegado =
(Delegado)Delegate.CreateDelegate(typeof(Delegado), Metodo);


se encuentre que el método indicado en "Metodo" no coincida con la
estructura indicada en "Delegado". Observa que Delegado sirve para apuntar a
rutinas que reciban un único argumento de tipo "array de Object" y que
devuelvan un int. ¿El método "Agr" recibe un array de Object y devuelve int?
Recuerda que los delegados son completamente estrictos en cuanto al tipo de
la rutina a la que apuntan, no valen para apuntar a otra rutina definida con
tipos distintos, aunque en tiempo de ejecución los tipos de la rutina se
puedan convertir a los tipos del delegado.
Respuesta Responder a este mensaje
#2 Maria
18/11/2008 - 13:01 | Informe spam
Muchas gracias Alberto, muy claras tus observaciones. Tenías razón con el
tema de los argumentos, no estaba identificando bien el método sobrecargado y
el tipo de argumento que recibía el delegado no era el mismo que el método
"Agr". Lo que quería hacer es no tener que definir un delegado por cada
sobrecarga ya que cada método recibe argumentos diferentes. Sabés alguna
forma de hacerlo? Por ahora, prefería la opción Invoke de Reflection, siendo
la más directa pero me gustaría indagar por la parte de delegados.

Maria.

"Alberto Poblacion" wrote:

"Maria" wrote in message
news:
> No logro enlazar el método delegado. Me da el error: El valor no puede ser
> nulo. Nombre del parámetro: method; o el error: Error al enlazar con
> el método de destino.

El primer error ("El valor no puede ser nulo. Nombre del parámetro:
method") ocurre si el method es null, cosa que a su vez ocurre si no existe
el método cuando lo buscas con la sentencia:
> MethodInfo Metodo = typeof(cGG_EMPLEADOS).GetMethod("Agr",flags);

La razón de que no lo encuentre puede ser porque la clase cGG_EMPLEADOS
no contenga un método "Agr", o porque las características de dicho método no
coincidan con las especificadas en "flags". Ah, y si el método tiene varias
sobrecargas tienes que especificar cuál de ellas estás buscando, indicando
los tipos de los argumentos mediante el parámetro Type[] que tiene una de
las sobrecargas de GetMethod.

El segundo error ("Error al enlazar con el método de destino.") te puede
ocurrir porque al ejecutar esta sentencia:
> Delegado delegado =
> (Delegado)Delegate.CreateDelegate(typeof(Delegado), Metodo);
se encuentre que el método indicado en "Metodo" no coincida con la
estructura indicada en "Delegado". Observa que Delegado sirve para apuntar a
rutinas que reciban un único argumento de tipo "array de Object" y que
devuelvan un int. ¿El método "Agr" recibe un array de Object y devuelve int?
Recuerda que los delegados son completamente estrictos en cuanto al tipo de
la rutina a la que apuntan, no valen para apuntar a otra rutina definida con
tipos distintos, aunque en tiempo de ejecución los tipos de la rutina se
puedan convertir a los tipos del delegado.



Respuesta Responder a este mensaje
#3 Alberto Poblacion
18/11/2008 - 17:35 | Informe spam
"Maria" wrote in message
news:
Muchas gracias Alberto, muy claras tus observaciones. Tenías razón con el
tema de los argumentos, no estaba identificando bien el método
sobrecargado y
el tipo de argumento que recibía el delegado no era el mismo que el método
"Agr". Lo que quería hacer es no tener que definir un delegado por cada
sobrecarga ya que cada método recibe argumentos diferentes. Sabés alguna
forma de hacerlo? Por ahora, prefería la opción Invoke de Reflection,
siendo
la más directa pero me gustaría indagar por la parte de delegados.



Se me ocurre una solución mejor: Prescinde por completo del delegado. Ya
que has obtenido el MethodInfo con la información sobre el método al que
quieres llamar, utiliza el método Invoke del MethodInfo para hacer la
llamada. El propio Invoke ya recibe un Object[] con los argumentos, y no se
necesita para nada el delegado.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida