C#中扩展方法和钩子机制使用
1.扩展方法:
扩展方法允许向现有类型 “添加” 方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像实例方法一样进行调用。
使用场景:
1.当无法修改某个类的源代码,但又希望为该类添加一些实用方法时,扩展方法就非常有用。
2.为第三方库中的类型添加额外的功能。
实现:
1.基础实现:
public class ExtensionTest : MonoBehaviour
{void Start(){MyClass obj = new MyClass(5);// 可以像调用实例方法一样调用扩展方法int result = obj.DoubleValue();Debug.Log($"Double value: {result}");}
}// 定义一个简单的类
public class MyClass
{public int Value { get; set; }public MyClass(int value){Value = value;}
}// 扩展方法必须定义在静态类中
public static class MyClassExtensions
{// 扩展方法必须是静态方法,且第一个参数使用 this 关键字指定要扩展的类型public static int DoubleValue(this MyClass myClass){return myClass.Value * 2;}
}
结果:

2.链式扩展:
public class ExtensionTest : MonoBehaviour
{void Start(){Person person = new Person("John", 25);// 链式调用扩展方法person.SetName("Alice").SetAge(30).PrintInfo();}
}// 定义一个简单的类
public class Person
{public string Name { get; set; }public int Age { get; set; }public Person(string name, int age){Name = name;Age = age;}public void PrintInfo(){Debug.Log($"Name: {Name}, Age: {Age}");}
}// 扩展方法类
public static class PersonExtensions
{// 扩展方法:设置姓名public static Person SetName(this Person person, string name){person.Name = name;return person;}// 扩展方法:设置年龄public static Person SetAge(this Person person, int age){person.Age = age;return person;}
}
结果:
2.钩子机制:
在 C# 中,钩子通常指的是在程序执行过程中预留的一些 “可插入点”,允许开发者在特定的时机插入自定义的逻辑。常见的实现方式有事件(Event)、抽象方法、委托等
使用场景:
1.当你需要在某个操作的前后执行自定义逻辑时,可以使用钩子。
2.实现插件化架构,允许开发者在系统的某些关键位置插入自定义的功能。
实现:
1.虚方法钩子:基类定义一个虚方法,该方法可以包含默认的实现逻辑,也可以为空。派生类重写这个虚方法,在其中添加自定义的逻辑。基类在执行某个算法时,会调用这个虚方法,这样派生类就可以在这个 “钩子点” 上插入自己的代码。
public class HookTest : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){// 创建魔法师角色GameCharacter mage = new Mage();mage.Attack();Console.WriteLine();// 创建战士角色GameCharacter warrior = new Warrior();warrior.Attack();}
}public class HookTest : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){// 创建魔法师角色GameCharacter mage = new Mage();mage.Attack();Console.WriteLine();// 创建战士角色GameCharacter warrior = new Warrior();warrior.Attack();}
}// 基类:游戏角色
public class GameCharacter
{// 虚方法,作为钩子public virtual void SpecialAbility(){Debug.Log("No special ability.");}// 角色的攻击方法,会调用钩子方法public void Attack(){Debug.Log("Character attacks!");SpecialAbility();}
}// 派生类:魔法师
public class Mage : GameCharacter
{// 重写虚方法,添加自定义逻辑public override void SpecialAbility(){Debug.Log("Mage casts a fireball!");}
}// 派生类:战士
public class Warrior : GameCharacter
{// 重写虚方法,添加自定义逻辑public override void SpecialAbility(){Debug.Log("Warrior uses a powerful shield bash!");}
}
结果:

2.事件钩子:
public class HookTest : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){MyProcessor processor = new MyProcessor();// 订阅事件,插入自定义逻辑processor.BeforeProcess += (sender, e) =>{Debug.Log("Before process: Custom logic executed.");};processor.AfterProcess += (sender, e) =>{Debug.Log("After process: Custom logic executed.");};processor.Process();}
}// 定义一个包含钩子的类
public class MyProcessor
{// 定义事件,作为钩子public event EventHandler BeforeProcess;public event EventHandler AfterProcess;public void Process(){// 在处理前触发事件BeforeProcess?.Invoke(this, EventArgs.Empty);Debug.Log("Processing...");// 在处理后触发事件AfterProcess?.Invoke(this, EventArgs.Empty);}
}
结果:

总结:
通过合理使用扩展方法和钩子方法,可以在保持外观模式简洁性的同时,提供强大的扩展能力。
1.扩展方法适合添加横向功能(如日志、监控)。
2.虚方法钩子适合调整核心流程。
3.事件机制适合实现观察者模式的松散耦合。
4.优先选择组合而非多层继承。
相关文章:
C#中扩展方法和钩子机制使用
1.扩展方法: 扩展方法允许向现有类型 “添加” 方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像实例方法一样进行调用。 使用场景: 1.当无法修改某个类的源代码&#…...
大语言模型减少幻觉的常见方案
什么是大语言模型的幻觉 大语言模型的幻觉(Hallucination)是指模型在生成文本时,输出与输入无关、不符合事实、逻辑错误或完全虚构的内容。这种现象主要源于模型基于概率生成文本的本质,其目标是生成语法合理、上下文连贯的文本&…...
YOLOv5、YOLOv6、YOLOv7、YOLOv8、YOLOv9、YOLOv10、YOLOv11、YOLOv12的网络结构图
文章目录 一、YOLOv5二、YOLOv6三、YOLOv7四、YOLOv8五、YOLOv9六、YOLOv10七、YOLOv11八、YOLOv12九、目标检测系列文章 本文将给出YOLO各版本(YOLOv5、YOLOv6、YOLOv7、YOLOv8、YOLOv9、YOLOv10、YOLOv11、YOLOv12)网络结构图的绘制方法及图。本文所展…...
03 UV
04 Display工具栏_哔哩哔哩_bilibili 讲的很棒 ctrlMMB 移动点 s 打针 ss 批量打针...
AIGC-几款本地生活服务智能体完整指令直接用(DeepSeek,豆包,千问,Kimi,GPT)
Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资…...
Django ORM 定义模型
提示:定义模型字段的类型 文章目录 一、字段类型二、字段属性三、元信息 一、字段类型 常用字段 字段名描述备注AutoFieldint 自增必填参数 primary_keyTrue,无该字段时,django自动创建一个 BigAutoField,一个model不能有两个Au…...
4.18---缓存相关问题(操作原子性,击穿,穿透,雪崩,redis优势)
为什么要用redis做一层缓存,相比直接查mysql有什么优势? 首先介绍Mysql自带缓存机制的问题: MySQL 的缓存机制存在一些限制和问题,它自身带的缓存功能Query Cache只能缓存完全相同的查询语句,对于稍有不同的查询语句,…...
java八股之并发编程
1.java线程和操作系统线程之间的区别? 现在java线程本质上是操作系统线程,java中采用的是一对一的线程模型(一个用户线程对应一个内核进程) 2.什么是进程和线程? 1.进程是操作系统一次执行,资源分配和调度的…...
C#/.NET/.NET Core拾遗补漏合集(25年4月更新)
前言 在这个快速发展的技术世界中,时常会有一些重要的知识点、信息或细节被忽略或遗漏。《C#/.NET/.NET Core拾遗补漏》专栏我们将探讨一些可能被忽略或遗漏的重要知识点、信息或细节,以帮助大家更全面地了解这些技术栈的特性和发展方向。 ✍C#/.NET/.N…...
层次式架构核心:中间层的功能、优势与技术选型全解析
层次式架构中的中间层是整个架构的核心枢纽,承担着多种重要职责,在功能实现、优势体现以及技术选型等方面都有丰富的内容,以下为你详细介绍: 一、功能 1.业务逻辑处理 复杂规则运算:在许多企业级应用中,…...
PDF.js 生态中如何处理“添加注释\添加批注”以及 annotations.contents 属性
我们来详细解释一下在 PDF.js 生态中如何处理“添加注释”以及 annotations.contents 属性。 核心要点:PDF.js 本身主要是阅读器,不是编辑器 首先,最重要的一点是:PDF.js 的核心库 (pdfjs-dist) 主要设计用于解析和渲染…...
MySQL性能调优(三):MySQL中的系统库(简介、performance_schema)
文章目录 MySQL性能调优数据库设计优化查询优化配置参数调整硬件优化 1.MySQL中的系统库1.1.系统库简介1.2.performance_schema1.2.1.什么是performance_schema1.2.2.performance_schema使用1.2.3.检查当前数据库版本是否支持1.2.4.performance_schema表的分类1.2.5.performanc…...
【Python语言基础】22、异常处理
文章目录 1. 异常1.1 简介1.2 为什么需要异常处理 2. 基本语法2.1 各部分详解 3. 异常处理流程3.1 执行try代码块3.2 异常发生检查3.3 异常捕获与匹配3.4 执行匹配的 except 代码块3.5 执行 else 代码块(可选)3.6 执行 finally 代码块(可选&a…...
印度zj游戏出海代投本土网盟广告核心优势
印度游戏出海代投本土网盟广告的核心优势包括: 本土化广告策略:针对印度市场的特点,定制本土化的广告策略,吸引更多印度用户的关注和参与。 深度了解印度市场:对印度文化、消费习惯、网络使用习惯等有深入了解&#x…...
NO.97十六届蓝桥杯备战|数论板块-最大公约数和最小公倍数|欧几里得算法|秦九韶算法|小红的gcd(C++)
约数和倍数 如果a 除以b 没有余数,那么a 就是b 的倍数,b 就是a 的约数,记作b ∣ a 。 约数,也称因数。 最⼤公约数和最⼩公倍数 最⼤公约数Greatest Common Divisor,常缩写为gcd。 ⼀组整数的公约数,是…...
《软件设计师》复习笔记(11.6)——系统转换、系统维护、系统评价
目录 一、遗留系统(Legacy System) 定义: 特点: 演化策略(基于价值与技术评估): 高水平 - 低价值: 高水平 - 高价值: 低水平 - 低价值: 低水平 - 高价…...
ROS机器人一般用哪些传感器?
以下是ROS机器人常用传感器的分层详解及思维导图总结,涵盖传感器分类、核心参数、ROS支持及典型应用: 一、环境感知传感器 1. 视觉传感器 类型 原理 ROS支持 数据类型 典型型号/驱动 优缺点及应用场景 单目摄像头 单镜头成像,通过透视变换获取2D图像,依赖算法推断深度 驱…...
嵌入式linux架构理解(宏观理解)6ull学习心得---从架构理解到自写程序运行及自写程序开机自启动
一、linux系统的三个组成部分 U-Boot、Linux kernel 和 rootfs 这三者一起构成了一个完整的 Linux 系 统,一个可以正常使用、功能完善的 Linux 系统。 1.在移植 Linux之前我们需要先移植一个 bootloader 代码,这个 bootloader 代码用于启动 Linux 内核,bootloader有很多,常…...
人像面部关键点检测
此工作为本人近期做人脸情绪识别,CBAM模块前是否能加人脸关键点检测而做的尝试。由于创新点不是在于检测点的标注,而是CBAM的改进,因此,只是借用了现成库Dilb与cv2进行。 首先,下载人脸关键点预测模型:Index of /file…...
面试算法高频08-动态规划-02
动态规划练习题 题目描述 给定两个字符串 text1 和 text2,要求返回这两个字符串的最长公共子序列。例如对于字符串 “ABAZDC” 和 “BACBAD”,需找出它们最长的公共子序列。子序列是指在不改变其余字符相对位置的情况下,从原始字符串中删除…...
PyTorch逻辑回归总结
目录 PyTorch逻辑回归总结神经网络基础基本结构学习路径 线性回归简单线性回归多元线性回归 逻辑回归核心原理损失函数 梯度下降法基本思想关键公式学习率影响 PyTorch实现数据准备模型构建代码优化 核心概念对比 PyTorch逻辑回归总结 神经网络基础 基本结构 输入节点隐藏节…...
使用 Vue 开发登录页面的完整指南
一、项目搭建与基础配置 环境准备 使用 Vue CLI 或 Vite 创建项目,推荐组合:Vue3 Element Plus Vue Router npm create vuelatest npm install element-plus element-plus/icons-vue vue-router 全局配置(main.js) import { c…...
EDID结构
EDID DDC通讯中传输显示设备数据 VGA , DVI 的EDID由128字节组成,hdmi的EDID增加扩展块128字节。扩展快的内容主要是和音频属性相关的,DVI和vga没有音频,hdmi自带音频,扩展快数据规范按照cea-861x标准。 Edid为了让pc或其他的图像…...
文件包含(详解)
文件包含漏洞是一种常见的Web安全漏洞,其核心在于应用程序未对用户控制的文件路径或文件名进行严格过滤,导致攻击者能够包含并执行任意文件(包括本地或远程恶意文件)。 1. 文件包含原理 动态文件包含机制 开发者使用动态包含函数…...
《SpringBoot中@Scheduled和Quartz的区别是什么?分布式定时任务框架选型实战》
🌟 大家好,我是摘星! 🌟 今天为大家带来的是Scheduled和Quartz对比分析: 新手常见困惑: 刚学SpringBoot时,我发现用Scheduled写定时任务特别简单。但当我看到同事在项目里用Quartz时&…...
安装fvm可以让电脑同时管理多个版本的flutter、flutter常用命令、vscode连接模拟器
打开 PowerShellfvm安装 dart pub global activate fvm安装完成后,如果显示FVM无法识别,那么需要去添加环境变量path添加这个:C:\Users\Administrator\AppData\Local\Pub\Cache\bin 常用命令 fvm releases 查看用户可以装的flutter版本fvm l…...
UNION和UNION ALL的主要区别
UNION和UNION ALL的主要区别在于处理重复数据和排序的方式。 UNION和UNION ALL都是SQL语言中用于合并两个或多个SELECT语句结果集的关键字。它们的主要区别如下: 1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,而UNION ALL不会…...
Kafka系列之:计算kafka集群topic占的存储大小
Kafka系列之:计算kafka集群topic占的存储大小 topic存储数据格式统计topic存储大小定时统计topic存储大小topic存储数据格式 单位是字节大小 size_bytes{directory="/data/datum/kafka/optics-all" } 782336计算topic存储大小脚本逻辑是: 计算指定目录或文件的大小…...
[密码学实战]Java使用Bouncy Castle实现Base64编码解码:完整指南
Java使用Bouncy Castle实现Base64编码解码:完整指南 摘要 本文将深入讲解如何通过Bouncy Castle(BC)加密库实现Base64编码解码,包含核心API使用、流式处理、与加密算法集成三大实战场景,提供5种代码实现方案和3种性能优化技巧。 一、Base64基础原理 1.1 编码机制 Bas…...
智谱AI大模型免费开放:开启AI创作新时代
文章摘要:近日,国内领先的人工智能公司智谱AI宣布旗下多款大模型服务免费开放,这一举措标志着大模型技术正式迈入普惠阶段。本文将详细介绍智谱AI此次开放的GLM-4 等大模型,涵盖其主要功能、技术特点、使用步骤以及应用场景&#…...
