2008-10-31 13 views
9

Estoy experimentando con las funciones de delegado de una matriz de delegados. Pude crear la matriz de delegados, pero ¿cómo llamo al delegado?Delegate Array

public delegate void pd(); 

public static class MyClass 
{ 

    static void p1() 
    { 
     //... 
    } 

    static void p2() 
    { 
     //... 
    } 

    //... 

    static pd[] delegates = new pd[] { 

     new pd(MyClass.p1), 
     new pd(MyClass.p2) 
     /* ... */ 
    }; 
} 

public class MainClass 
{ 
    static void Main() 
    { 
     // Call pd[0] 
     // Call pd[1] 
    } 
} 

EDIT: La razón de la matriz es que tengo que llamar a las funciones delegadas por un índice, según sea necesario. No se ejecutan en respuesta a un evento. Veo un error crítico (estúpido) en mi código porque intenté ejecutar la función de delegado usando el tipo pd [] en lugar del nombre de la matriz (delegados).

Respuesta

14

Si son todos del mismo tipo, ¿por qué no combinarlos en un único delegado de multidifusión?

static pd delegateInstance = new pd(MyClass.p1) + new pd(MyClass.p2) ...; 

... 
pd(); 
+0

Una razón por la que no sería manejar individualmente las excepciones lanzadas por cualquiera de los delegados, en lugar de simplemente atrapar la primera. –

+0

Según mi edición, los delegados no se ejecutan en respuesta a un evento, sino que se llaman individualmente usando un índice en la matriz. – pro3carp3

+0

@jacob_c - sí, si de verdad quieres :) @ pro3carp3 - en ese caso solo necesitas acceder a él por índice como para una matriz normal. No hay nada de especial en que sea un delegado aquí. –

7
public class MainClass 
{ 
    static void Main() 
    { 
     pd[0](); 
     pd[1](); 
    } 
} 
+0

Técnicamente, que debe ser MyClass.pd [0](). pd es un tipo, y MyClass.pd es un miembro estático de MyClass. –

+0

¿Por qué no combina les PD juntos? –

7

En .Net, cualquier delegado es, de hecho, en realidad un delegado "multicast" (que hereda de esta clase incorporada base), y por lo tanto contiene una lista vinculada interna que puede contener cualquier número de delegados de destino.

Puede acceder a esta lista llamando al método GetInvocationList() en el delegado. Este método devuelve una matriz de Delegados ...

La única restricción es que todos los delegados dentro de la lista vinculada de un delegado determinado deben tener la misma firma, (ser del mismo tipo de delegado). Si necesita que su colección pueda contener delegados de diferentes tipos, entonces necesita construir su propia lista o clase de colección.

Pero si esto está bien, entonces se puede "llamar" a los delegados en la lista de invocación de un delegado dado como este:

public delegate void MessageArrivedHandler(MessageBase msg); 
public class MyClass 
{ 
    public event MessageArrivedHandler MessageArrivedClientHandler; 

    public void CallEachDelegate(MessageBase msg) 
    { 
      if (MessageArrivedClientHandler == null) 
       return; 
      Delegate[] clientList = MessageArrivedClientHandler.GetInvocationList(); 
      foreach (Delegate d in clientList) 
      { 
       if (d is MessageArrivedHandler) 
        (d as MessageArrivedHandler)(msg); 
      } 
    } 
} 
3
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     pd[0](); 
     pd[1](); 
    } 

    public delegate void delegates(); 

    static delegates[] pd = new delegates[] 
          { 
           new delegates(MyClass.p1), 
           new delegates(MyClass.p2) 
          }; 

    public static class MyClass 
    { 
     public static void p1() 
     { 
      MessageBox.Show("1"); 
     } 

     public static void p2() 
     { 
      MessageBox.Show("2"); 
     } 
    } 
} 
+0

Es "delegado" no "delegado" –

0
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     pd[0](1); 
     pd[1](2); 
    } 

    public delegate void delegates(int par); 
    static delegates[] pd = new delegates[] 
            { 
             new delegates(MyClass.p1), 
             new delegates(MyClass.p2) 
            }; 
    public static class MyClass 
    { 

     public static void p1(int par) 
     { 
      MessageBox.Show(par.ToString()); 
     } 

     public static void p2(int par) 
     { 
      MessageBox.Show(par.ToString()); 
     } 


    } 

}