La clase System.MulticastDelegate

    Ya se ha dicho que la sintaxis especial de definición de delegados no es más que una forma especial definir subclases de System.MulticastDelegate. Esta clase a su vez deriva de System.Delegate, que representa a objetos delegados que sólo puede almacenar un único método. Por tanto, todos los objetos delegado que se definan contarán con los siguientes miembros comunes heredados de estas clases:

  • object Target: Propiedad de sólo lectura que almacena el objeto al que pertenece el último método añadido al objeto delegado. Si es un método de clase vale null.
  • MethodInfo Method: Propiedad de sólo lectura que almacena un objeto System.Reflection.MethodInfo con información sobre el último método añadido al objeto (nombre, modificadores, etc.) Para saber cómo acceder a estos datos puede consultar la documentación incluida en el SDK sobre la clase MethodInfo  
  • Delegate[] getInvocationList(): Permite acceder a todos los métodos almacenados en un delegado, ya que devuelve una tabla cuyos elementos son delegados cada uno de los cuales almacenan uno, y sólo uno, de los métodos del original. Estos delegados se encuentran ordenados en la tabla en el mismo orden en que sus métodos fueron fue almacenados en el objeto delegado original.

    Este método es especialmente útil porque a través de la tabla que retorna se pueden hacer cosas tales como ejecutar los métodos del delegado en un orden diferente al de su almacenamiento, procesar los valores de retorno de todas las llamadas a los métodos del delegado original, evitar que una excepción en la ejecución de uno de los métodos impida la ejecución de los demás, etc.

    Aparte de estos métodos de objeto, la clase System.MulticastDelegate también cuenta con los siguientes métodos de tipo de uso frecuente:

  • static Delegate Combine(Delegate fuente, Delegate destino): Devuelve un nuevo objeto delegado que almacena la concatenación de los métodos de fuente con los de destino. Por tanto, nótese que estas tres instrucciones son equivalentes:



 objDelegado += new D(obj1.g);
 objDelegado = objDelegado + new D(obj1.g);
 objDelegado = (D) MulticastDelegate.Combine(objDelegado, new D(obj1.g);

    Es más, en realidad el compilador de C# lo que hace es convertir toda aplicación        del operador + entre delegados en una llamada a Combine() como la mostrada.

    Hay que tener cuidado con los tipos de los delegados a combinar ya que han de ser exactamente los mismos o si no se lanza una System.ArgumentException, y ello ocurre aún en el caso de que dichos sólo se diferencien en su nombre y no en sus tipos de parámetros y valor de retorno.           

  • static Delegate Combine(Delegate[] tabla): Devuelve un nuevo delegado cuyos métodos almacenados son la concatenación de todos los de la lista que se le pasa como parámetro y en el orden en que apareciesen en ella. Es una buena forma de crear delegados con muchos métodos sin tener que aplicar += varias veces. Todos los objetos delegados de la tabla han de ser del mismo tipo, pues si no se produciría una  System.ArgumentException.

  • static Delegate Remove(Delegate original, Delegate aBorrar): Devuelve un nuevo delegado cuyos métodos almacenados son el resultado de eliminar de original los que tuviese aBorrar. Por tanto, estas instrucciones son equivalentes:

 
objDelegado -= new D(obj1.g);
 objDelegado - objDelegado - new D(obj1.g);
 objDelegado = (D) MulticastDelegate.Remove(objDelegado, new D(obj1.g);

    Nuevamente, lo que hace el compilador de C# es convertir toda aplicación del operador - entre delegados en una llamada a Remove() como la mostrada. Por tanto, al igual que con -=, para borrar métodos de objeto se ha de especificar en aBorrar un objeto delegado que contenga referencias a métodos asociados a exactamente los mismos objetos que los almacenados en original.

  •  static Delegate CreateDelegate (Type tipo, MehodInfo método): Ya se usó este método en el ejemplo de comprobación de tipos del epígrafe “Definición de delegados” de este mismo tema. Como recordará permite crear dinámicamente objetos delegados, ya que devuelve un objeto delegado del tipo indicado que almacena una referencia al método representado por su segundo parámetro.
La clase MulticastDelegate
José Antonio González Seco

José Antonio es experto en tecnologias Microsoft. Imparte cursos y conferencias en congresos sobre C# y .NET en Universidades de toda España (Sevilla, Barcelona, San Sebastián, Valencia, Oviedo, etc.) en representación de grandes empresas como Microsoft.
Fecha de alta:18/10/2006
Última actualizacion:18/10/2006
Visitas totales:15242
Valorar el contenido:
Últimas consultas realizadas en los foros
Últimas preguntas sin contestar en los foros de devjoker.com