C#委托方法Func()中GetInvocationList()方法的用法介绍

在日常使用委托时,有以下常用方法

方法名称 说明
 Clone   创建委托的浅表副本。
 GetInvocationList   按照调用顺序返回此多路广播委托的调用列表。
 GetMethodImpl   返回由当前的 MulticastDelegate 表示的静态方法。
 GetObjectData   用序列化该实例所需的所有数据填充 SerializationInfo 对象。
 MemberwiseClone   创建当前 Object 的浅表副本。
 RemoveImpl   调用列表中移除与指定委托相等的元素

GetInvocationList() 的用途

当委托有多个返回值时

当你编写一个 delegate委托 或 Func<>泛型委托 ,并为实例绑定多个方法时,每个方法都有一个返回值。可能会遇到这种情况:

class Program
    {
        public static string a(string str)
        {
            Console.WriteLine("方法a");
            return str+"方法a";
        }
        public static string b(string str)
        {
            Console.WriteLine("方法b");
            return str + "方法b";
        }
        public static string c(string str)
        {
            Console.WriteLine("方法c");
            return str + "方法c";
        }
        static void Main(string[] args)
        {
            Func<string, string> func=a;
            func += b;
            func += c;
            Console.WriteLine(func("测试"));
            Console.ReadKey();
        }

    }

调用委托后,只能获取到最后一个调用方法的返回值。

使用 GetInvocationList()

GetInvocationList() 能够返回 这个委托的方法链表。

通过使用循环,把每个方法顺序调用一次,每次循环中都会产生当前调用方法的返回值。

class Program
{
    public static string a(string str)
    {
        Console.WriteLine("方法a");
        return str+"方法a";
    }
    public static string b(string str)
    {
        Console.WriteLine("方法b");
        return str + "方法b";
    }
    public static string c(string str)
    {
        Console.WriteLine("方法c");
        return str + "方法c";
    }
    static void Main(string[] args)
    {
        Func<string, string> func=a;
        func += b;
        func += c;
        var funclist = func.GetInvocationList();
        foreach (Func<string, string> f in funclist)
        {
            Console.WriteLine(f("测试"));
        }
        Console.ReadKey();
    }

相当于把委托里顺序调用的方法分离成一个列表,通过循环调用,循环获取。

以上所述是小编给大家介绍的C#委托方法Func()中GetInvocationList()方法的用法,希望对大家有所帮助。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • c#多线程通信之委托事件

    在研究c# 线程之间通信时,发现传统的方法大概有三种: 全局变量,由于同一进程下的多个进程之间共享数据空间,所以使用全局变量是最简单的方法,但要记住使用volatile进行限制. 线程之间发送消息(这个随后文章中会讨论到). CEvent为MFC中的一个对象,可以通过对CEvent的触发状态进行改变,从而实现线程间的通信和同步,这个主要是实现线程直接同步的一种方法. 本文介绍的一种方法是这三种之外的一种方法,本文中实例是通过创建一个线程类,通过委托事件把值传送到Form所在的类中,同时更新For

  • 关于C#委托三种调用的分享使用

    一.同步调用 1.同步调用会按照代码顺序来执行 2.同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量IO操作),可能会让程序停顿很长时间,造成糟糕的用户体验,这时候异步调用就很有必要了. 举个栗子: using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Remoting.Messaging; using System.Text; using System.Threadi

  • C#委托与事件原理及实例解析

    委托:个人在这里理解 委托就是 定义一个引用,一个可以记录函数指针的引用. public delegate void GreetingDelegate(int param); 事件:就是基于委托定义的. public event GreetingDelegate payxx; 其实这里的事件payxx 就差不多和string 一样可,只不过是存函数指针的变量. 这里上一个例子代码: using UnityEngine; using System.Collections; using UnityE

  • C#中委托的基础入门与实现方法

    目录 前言 关于委托 委托的实现 一.基本实现方式 二.使用委托时的一些特殊方式 1.委托实例对象的创建多元化: 2.事件绑定的多种方式 三.委托的几种特殊实现方式 1,使用Action方法 2,使用Func方法 四.委托的一些特殊小知识 1.委托闭包的产生 2,关于事件 总结 前言 似乎委托对于C#而言是一种高级属性,但是我依旧希望你就算第一次看我的文章,也能有很大的收获. 所以本博客的语言描述尽量简单易懂,知识点也是面向初入门对于委托不了解的学习者的.当然如果有幸有大佬发现文章的错误点,也欢

  • 大白话讲解C# 中的委托

    有一天,你写了好多好多带"形参"的构造函数(就是"方法",同义),而且需要向这些构造函数里传递同样的"实参",然后你就憨憨地一个一个函数的调用并赋予同样的"实参",这一天就这么过去了... 又过了几天,你又要再一次调用这么多函数了,你再老老实实地一个一个函数进行调用?!聪明的你,肯定会想:真TM麻烦!有没有一劳永逸的办法呢? 你需要的正是----"委托" 来,先看一个简单的例子,要表述的是----有一位贵宾

  • c# 委托的常见用法

    此篇文章是我一个小白对委托的理解和总结,请高手多多评判指教. 委托就是一种后期绑定机制,说的直白点就是在调用的时候才去传递业务逻辑的一种算法. 委托的创建语法: public delegate int Comparison<in T>(T left, T right);//官方给出的定义泛型委托的demo 语法看似像声明一个变量或方法的签名,但实现上是在声明一个类型.编译器会生成一个派生自System.MulticastDelegate的类(而System.MulticastDelegate派

  • C#线程委托实现原理及方法解析

    很多时候写windows程序都需要结合多线程,在C#中用如下得代码来创建并启动一个新的线程. Thread thread = new Thread(new ThreadStart(ThreadProc));//实例化一个线程 thread.IsBackground = true;//将线程改为后台线程 thread.Start();//开启线程 但是很多时候,在新的线程中,我们需要与UI(Windows窗体设计器用户界面)进行交互,在C#中不允许直接这样做.可以参考MSDN中的描述. "Wind

  • c#委托与事件(详解)

    目录 前言 一.声明方法 二.声明委托 三.实例化委托 四.使用委托 总结 前言 .NET中的委托是一个类,它定义了方法的类型,是一个方法容器.委托把方法当作参数,可以避免在程序中大量使用条件判断语句的情况. 项目名为Test,class类名为Program 一.声明方法 在class类中声明几个方法,以便委托的使用. using System; namespace Test { class Program { /// <summary> /// 返回两个数中较大者 /// </summ

  • c# 委托的本质是什么

    引言 上一个专题已经和大家分享了我理解的--C#中为什么需要委托,专题中简单介绍了下委托是什么以及委托简单的应用的,在这个专题中将对委托做进一步的介绍的,本专题主要对委本质和委托链进行讨论. 一.委托的本质 平时我们很容易使用委托--用C# delegate关键字定义委托,再用new操作符构造委托实例,然后通过调用委托实例来调用回调方法(就是用一个了委托对象的变量来代替方法名,这句话如果刚接触的人不好理解的话,这里给个例子:MyDelegate mydelegate =new Mydelegat

  • C#委托方法Func()中GetInvocationList()方法的用法介绍

    在日常使用委托时,有以下常用方法 方法名称 说明  Clone   创建委托的浅表副本.  GetInvocationList   按照调用顺序返回此多路广播委托的调用列表.  GetMethodImpl   返回由当前的 MulticastDelegate 表示的静态方法.  GetObjectData   用序列化该实例所需的所有数据填充 SerializationInfo 对象.  MemberwiseClone   创建当前 Object 的浅表副本.  RemoveImpl   调用列

  • python 的numpy库中的mean()函数用法介绍

    1. mean() 函数定义: numpy.mean(a, axis=None, dtype=None, out=None, keepdims=<class numpy._globals._NoValue at 0x40b6a26c>)[source] Compute the arithmetic mean along the specified axis. Returns the average of the array elements. The average is taken over

  • 基于Python2、Python3中reload()的不同用法介绍

    reload() 简介 作用:用于重新载入之前载入的模块 语法格式:reload(module) 参数:module为模块对象,必须已经被加载 返回值:返回模块对象 注意事项: 多次重复使用import语句时,不会重新加载被指定的模块,只是把对该模块的内存地址给引用到本地变量环境. reload()会重新加载已加载的模块,重新编译模块,重新执行模块级代码,但是__init__函数不再重复执行,原来已经使用的实例还是会使用旧的模块,而新生产的实例会使用新的模块:reload后还是用原来的内存地址:

  • SQLServer中exists和except用法介绍

    目录 一.exists 1.1 说明 1.2 示例 1.3 intersect/2017-07-21 二.except 2.1 说明 2.2 示例 三.测试数据 一.exists 1.1 说明 EXISTS(包括 NOT EXISTS)子句的返回值是一个 BOOL 值.EXISTS 内部有一个子查询语句(SELECT ... FROM...),我将其称为 EXIST 的内查询语句.其内查询语句返回一个结果集. EXISTS 子句根据其内查询语句的结果集空或者非空,返回一个布尔值. exists:

  • WPF中的数据模板用法介绍

    数据模板常用在3种类型的控件, 下图形式: 1.Grid这种列表表格中修改Cell的数据格式, CellTemplate可以修改单元格的展示数据的方式. 2.针对列表类型的控件, 例如树形控件,下拉列表,列表控件, 可以修改其中的ItemTemplate. 3.修改ContentTemplate, 例UserControl控件的数据展现形式. CellTemplate 模板 下面用一个例子, 来演示CellTemplate使用.例子实现一个DataGrid 展示一个普通的数据标, 同时新增一列C

  • Python中的with...as用法介绍

    这个语法是用来代替传统的try...finally语法的. 复制代码 代码如下: with EXPRESSION [ as VARIABLE] WITH-BLOCK 基本思想是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法. 紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量.当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法. 复制代码 代码如下: fil

  • ASP.NET Core MVC中Form Tag Helpers用法介绍

    简介 我们已经介绍过Tag Helpers以及一些最常用的Tag Helpers,也谈到了缓存Tag Helpers.在这篇文章中,我们将讨论表单Tag Helpers. HTML或Web表单通过使用各种HTML元素用于收集来自用户的输入,如输入框.复选框.单选按钮.下拉列表等.使用 <form> 元素时,我们通常使用POST请求.虽然也可以使用GET请求,不过GET请求建议提交于少量.非敏感的数据来获取数据. ASP.NET Core MVC提供了一些Form Tag Helpers,让我们

  • C++中strtok()函数的用法介绍

    函数原型:char *strtok(char *s, const char *delim);Function:分解字符串为一组字符串.s为要分解的字符串,delim为分隔符字符串.Description:strtok()用来将字符串分割成一个个片段.参数s指向欲分割的字符串,参数delim则为分割字符串,当strtok()在参数s的字符串中发现到参数delim的分割字符时 则会将该字符改为\0 字符.在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL.每次调

  • Vue.js中v-for指令的用法介绍

    一.什么是v-for指令 在Vue.js中,我们可以使用v-for指令基于源数据重复渲染元素.也就是说可以使用v-for指令实现遍历功能,包括遍历数组.对象.数组对象等. 二.遍历数组 代码示例如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content=&quo

  • Vue.js中v-bind指令的用法介绍

    一.什么是v-bind指令 v-bind指令用于响应更新HTML特性,允许将一个或多个属性动态绑定到表达式.v-bind是应用在动态属性上面的. 二.语法 v-bind语法如下: v-bind:动态属性名称="变量" 也可以简写成下面的形式: :动态属性名称="变量" 代码示例如下: <img :src="imgUrl" :title="title" /> 这里的src和title都是<img>标签的属

随机推荐