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
 

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.

Preguntas similares