【问题标题】:Delegate Array in C#C# 中的委托数组
【发布时间】:2010-09-20 06:50:08
【问题描述】:

我正在尝试从委托数组中调用委托函数。我已经能够创建委托数组,但是如何调用委托?

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]
    }
}

编辑: 数组的原因是我需要根据需要通过索引调用委托函数。它们不会响应事件而运行。我在代码中看到一个严重(愚蠢)错误,因为我试图使用 pd[] 类型而不是数组(委托)的名称来执行委托函数。

【问题讨论】:

    标签: c# arrays delegates


    【解决方案1】:

    如果它们都是同一类型,为什么不将它们组合成一个多播委托?

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

    【讨论】:

    • 不这样做的一个原因是单独处理任何代表抛出的异常,而不是仅仅捕获第一个。
    • 根据我的编辑,委托不会响应事件而执行,而是使用数组中的索引单独调用。
    • @jacob_c - 是的,如果你真的想要:) @pro3carp3 - 在这种情况下,你只需要按照数组的正常索引来访问它。在这里当代表没什么特别的。
    • 谢谢,乔恩。我犯了一个愚蠢的错误,并认为我错过了什么。
    【解决方案2】:
    public class MainClass
    {
        static void Main()
        {
            pd[0]();
            pd[1]();
        }
    }
    

    【讨论】:

    • 从技术上讲,这应该是 MyClass.pd[0]()。 pd 是一个类型,MyClass.pd 是 MyClass 的静态成员。
    • 为什么不把les PD合并起来!
    【解决方案3】:

    在 .Net 中,任何委托实际上都是“多播”委托(它继承自这个内置基类),因此包含一个内部链表,其中可以包含任意数量的目标委托。

    您可以通过在委托本身上调用 GetInvocationList() 方法来访问此列表。这个方法返回一个委托数组...

    唯一的限制是给定委托的链表内的所有委托必须具有相同的签名(具有相同的委托类型)。如果您需要您的集合能够包含不同类型的委托,那么您需要构建自己的列表或集合类。

    但如果这没问题,那么您可以像这样“调用”给定委托的调用列表中的委托:

    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);
              }
         }
    }
    

    【讨论】:

      【解决方案4】:
      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");
              }
          }
      }
      

      【讨论】:

      • 这是“代表”而不是“代表”
      【解决方案5】:
      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());
              }
      
      
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多