From: http://www.xuebuyuan.com/841530.html

在讲如何获取多个返回值之前先来看一个小例子:

private void button1_Click(object sender, EventArgs e)
{
  int Number = 200; //设置Number的值为 200。
  Publishser pub = new Publishser(); //实例化Publishser
  Subscriber1 sub1 = new Subscriber1(); //实例化Subscriber1
  Subscriber2 sub2 = new Subscriber2(); //实例化Subscriber2
  Subscriber3 sub3=new Subscriber3(); //实例化Subscriber3
  pub.NumberChanged += sub1.OnNumberChanged; //将方法绑定到委托
  pub.NumberChanged += sub2.OnNumberChanged;
  pub.NumberChanged += sub3.OnNumberChanged;
  pub.DoComething(Number); //调用DoComething
}

class Publishser
{
  public delegate int DemoEventHandler(int num); //定义委托,可代表的方法类型是整形
  public event DemoEventHandler NumberChanged; //申明事件
  public void DoComething(int temp)
  {
    if (NumberChanged != null)
    {
      temp=NumberChanged(temp);
    }
    MessageBox.Show(temp.ToString());
  }
}

class Subscriber1
{
  public int OnNumberChanged(int num)
  {
    MessageBox.Show(“调用了Subscriber1类,num值为:”+ num);
    return num + 100; ;
  }
}

class Subscriber2
{
  public int OnNumberChanged(int num)
  {
    MessageBox.Show(“调用了Subscriber2类 num值为:”+num);
    return num+100;
  }
}

class Subscriber3
{
  public int OnNumberChanged(int num)
  {
    MessageBox.Show(“调用了Subcriber3类,num值为:”+num);
    return num+100;
  }
}

我以为得到的结果是:

调用了Subscriber1类,num值为:200

调用了Subscriber2类,num值为:300

调用了Subscriber3类,num值为:400

500

但是程序运行完之后结果却不是我所想的,结果是:

调用了Subscriber1类,num值为:200

调用了Subscriber2类,num值为:200

调用了Subscriber3类,num值为:200

300

发现问题之后我用逐语句运行的方式调试程序,我发现当NumberChanged != null 第一次调用了Subscriber1之后并没有返回到Publishser类,也没有执行Subscriber1的 return,而是直接调用了Subscriber2,temp的值依旧是刚开始的200。执行完之后调用Subscriber3,只有当Subscriber3执行完了之后才返回到Publishser 这个时候temp的值等于300。(现在我也不知道为什么会这样,但是我在网上学习了一种可以获取多个返回值的方法!)

—————————————————————————————————————————————————————————————————

获取多个返回值:

private void button1_Click(object sender, EventArgs e)
{
  int Number = 200;
  Publishser pub = new Publishser();
  Subscriber1 sub1 = new Subscriber1();
  Subscriber2 sub2 = new Subscriber2();
  Subscriber3 sub3=new Subscriber3();
  pub.NumberChanged += sub1.OnNumberChanged;
  pub.NumberChanged += sub2.OnNumberChanged;
  pub.NumberChanged += sub3.OnNumberChanged;
  pub.DoComething(Number);
}

class Publishser
{
  public delegate int DemoEventHandler(int num);
  public event DemoEventHandler NumberChanged;
  public void DoComething(int temp)
  {
    if (NumberChanged != null)
    {
      Delegate[] delArray = NumberChanged.GetInvocationList();
      foreach (Delegate del in delArray)
      {
        DemoEventHandler method = (DemoEventHandler)del;
        temp = method(temp);
      }
    }
    MessageBox.Show(temp.ToString());
  }
}

class Subscriber1
{
  public int OnNumberChanged(int num)
  {
    MessageBox.Show(“调用了Subscriber1类,num值为:”+ num);
    return num + 100; ;
  }
}

class Subscriber2
{
  public int OnNumberChanged(int num)
  {
    MessageBox.Show(“调用了Subscriber2类 num值为:”+num);
    return num+100;
  }
}

class Subscriber3
{
  public int OnNumberChanged(int num)
  {
    MessageBox.Show(“调用了Subcriber3类,num值为:”+num);
    return num+100;
  }
}

运行得到的结果是:

调用了Subscriber1类,num值为:200

调用了Subscriber2类,num值为:300

调用了Subscriber3类,num值为:400

500

现在就是我想到的结果了,利用Delegate 基类的GetInvocationList()静态方法,可以得到委托链表,随后遍历委托链表依次执行,就可以得到每个方法的返回值了。

 

 

出处:https://dandelioncloud.cn/article/details/1536139037803134978

原文地址:http://www.cnblogs.com/mq0036/p/16920788.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性