• 用《斗破苍穹》的视角打开C#委托2 委托链 / 泛型委托 / GetInvocationList


    委托链

    • 经过不懈地努力,我终于成为了斗师,并成功掌握了两种斗技——八极崩和焰分噬浪尺。
    • 于是,我琢磨着,能不能搞一套连招,直接把对方带走。
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace FrameworkDemo
    {
        class Program
        {
            delegate void 攻击委托类型(string a);
    
            static void 八极崩(string a) {
                Console.WriteLine("八极崩");
            }
            static void 焰分噬浪尺(string a)
            {
                Console.WriteLine("焰分噬浪尺");
            }
            static void Main(string[] args)
            {
                // 创建委托链
                攻击委托类型 一套连招 = new 攻击委托类型(八极崩);
                // 攻击委托类型 一套连招 = 八极崩;   // 也可以这样写
                一套连招 += 焰分噬浪尺;
                // 启动委托
                一套连招("吃我一记连招");
                Console.ReadLine();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    请添加图片描述

    委托链返回值(GetInvocationList)

    • 这连招确实是打出来了,但是我怎么知道我打出了多少伤害呢?所以我要想办法接受这套输出的反馈。
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace FrameworkDemo
    {
        class Program
        {
            delegate int 攻击委托类型(string a);
    
            static int 八极崩(string a) {
                Console.WriteLine("八极崩");
                return 330;
            }
            static int 焰分噬浪尺(string a)
            {
                Console.WriteLine("焰分噬浪尺");
                return 660;
            }
            static void Main(string[] args)
            {
                // 创建委托
                攻击委托类型 一套连招 = 八极崩;
                一套连招 += 焰分噬浪尺;
                // 获取委托链
                Delegate[] delList = 一套连招.GetInvocationList();
                // 遍历委托链
                for (int i = 0; i < delList.Length; i++) {
                    攻击委托类型 del = (攻击委托类型)delList[i];
                    // 一次调用委托并获取返回值
                    int result = del("吃我一套连招");
                    Console.WriteLine($"攻击伤害:{result}");
                }
                Console.ReadLine();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    请添加图片描述

    泛型委托

    • 这时候,问题就来了,我每创建一个委托,岂不是都要先定义一个委托类型,然后再创建一个委托实例,假设这个委托类型只用一次,那我岂不是要在我的类里面定义一大堆的委托?
    • 于是乎,就出现了一系列的泛型委托。
    • Action是不带有返回值的泛型,而Func具有返回值。
    using System;
    
    namespace FrameworkDemo
    {
        class Program
        {
            static void 八极崩() {
                Console.WriteLine("八极崩");
            }
            static void 焰分噬浪尺(string a)
            {
                Console.WriteLine("焰分噬浪尺");
            }
            static string 佛怒火莲(string a) {
                Console.WriteLine("佛怒火莲");
                return "成功击杀敌军!";
            }
    
            static void Main(string[] args)
            {
                // 不带返回值的委托
                Action 攻击委托1 = 八极崩;
                攻击委托1();
                Action<string> 攻击委托2 = 焰分噬浪尺;
                攻击委托2("吃我一击!");
                // 带返回值的委托
                // <>中的最后一个参数是函数的返回值类型
                Func<string, string> 攻击委托3 = 佛怒火莲;
                string result = 攻击委托3("绝杀");
                Console.ReadLine();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
  • 相关阅读:
    【SwiftUI模块】0007、SwiftUI新手指引-新手指示-聚光灯介绍说明
    17 Python的os模块
    10_ue4进阶_添加倒地和施法动作
    数据结构(六)单向循环链表
    设计原则四:里氏替换原则
    【Ansible自动化运维工具 1】Ansible常用模块详解(附各模块应用实例和Ansible环境安装部署)
    数据治理-数据资产估值
    【深度学习】LeNet网络架构
    【nlp】1.2文本张量表示方法(词向量word2seq和词嵌入Word Embedding)
    SwiftUI Swift 教程之 14 个有用的数组运算符
  • 原文地址:https://blog.csdn.net/Nire_Yeyu/article/details/133236134