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()静态方法,可以得到委托链表,随后遍历委托链表依次执行,就可以得到每个方法的返回值了。

.Net (C#)委托和事件(获取多个返回值)相关推荐

  1. python3 协程 返回值_python asyncio 获取协程返回值和使用callback

    1. 获取协程返回值,实质就是future中的task import asyncio import time async def get_html(url): print("start ge ...

  2. 统计文件种类数+获取子shell返回值的其它方法

    前言 只是作为一个shell的小小练习和日常统计用,瞎折腾的过程中也是摸到了获取子shell返回值的几种方法: 肯定还有别的方法,跟进程间的通信相关,希望你能提出建议和补充,谢谢~ 完整程序: #! ...

  3. ajax成功进入success但是获取不到返回值

    一.前言 最近做前端的时候,发现个奇怪的问题,ajax获取不到返回值了,问题是还是会到success中,也是可以正常打印的,就是没有response,奇怪. 二.正文 1.首先是不走success的问 ...

  4. python 多进程multiprocessing 如何获取子进程的返回值?进程池pool,apply_async(),get(),

    案例1 # -*- coding: utf-8 -*- """ @File : 20200318_摄像头多进程流传输.py @Time : 2020/3/18 14:58 ...

  5. php 获取返回值,求助 如何获取php socket 返回值

    使用抓包工具可以看到,就是页面获取不到返回值,怎么办?? function Send_socket_connect($service_port, $address, $in) { header(&qu ...

  6. 在 C# 中如何获取存储过程的返回值 ?

    咨询区 GurdeepS: 我有下面的查询语句: set ANSI_NULLS ON set QUOTED_IDENTIFIER ON goALTER PROCEDURE [dbo].[Validat ...

  7. linux获取命令的返回值,Shell $?:获取函数返回值或者上一个命令的退出状态

    $?是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值. 所谓退出状态,就是上一个命令执行后的返回结果.退出状态是一个数字,一般情况下,大部分命令执行成功会返回0,失败返回1,这和C ...

  8. SpringAop切面中获取方法的返回值

    场景: 需要用到aop统一接口异常的返回值 当接口抛出异常的时候封装成response对象,但是如果不同接口要返回的response不同,需要在执行前获取到接口返回值的类型 如果要取到方法的返回值,需 ...

  9. 前端:JS/32/form对象(表单)(form对象的属性,方法和事件),受返回值影响的两个事件(onclick事件,onsubmit事件),获取表单的元素对象的三种方式,表单的提交和验证方法总结

    form 对象(表单) 一个<form>标记,就是一个<form>对象: 1,form对象的属性 name :表单的名称,主要用来让JS来控制表单: action :表单的数据 ...

最新文章

  1. Linux简单的颜色设置
  2. linux windows主题下载官网,Linux Deepin 15.10.2 桌面kwin主题App美化
  3. 如何从机器学习数据中获取更多收益 1
  4. 看完99%的人都学会了!9次Android面试经验总结,我先收藏为敬
  5. OC基础--OC中的类方法和对象方法
  6. 常用的C#方法【Format.CS】
  7. 深度学习自学(二):人脸检测MTCNN学习总结
  8. wireshark中筛选中文内容
  9. 未支付订单超时处理分析
  10. vue H5移动端项目 真机测试配置
  11. 带你了解什么是MySQL数据库(八)数据库锁机制
  12. MFC 执行顺序总结
  13. 史沐凡的python笔记之时间转换datetime模块的练习
  14. 【优化调度】基于matlab遗传算法求解公交车调度排班优化问题【含Matlab源码 2212期】
  15. 轻量化CICD平台建设
  16. 使用 Cocos2d-x 和粒子编辑器实现“天天爱消除”场景特效
  17. openbroadcast中文_OBS直播软件下载|Open Broadcaster Software(obs直播软件) v0.651 官方中文版 - 今朝下载...
  18. 微信小程序游戏跳一跳模拟
  19. 2018年10月ios最新退款方法 苹果内购退款流程 必看!!!
  20. 自己动手做QQ空间音乐的链接

热门文章

  1. c语言实验四报告,湖北理工学院14本科C语言实验报告实验四数组
  2. Siamese网络(孪生神经网络)详解
  3. Spring—集成Junit
  4. leetcode 778. 水位上升的泳池中游泳(并查集)
  5. leetcode 239. 滑动窗口最大值(单调队列)
  6. Box Shadow CSS教程–如何向任何HTML元素添加投影
  7. 掩码 项目编码_每天进行20天的编码项目
  8. advanced east_SpriteKit Advanced —如何构建2,5D游戏(第二部分)
  9. 事件捕获(capture)和冒泡事件(Bubble)
  10. There is no public key available for the following key IDs:3B4FE6ACC0B21F32