当前位置: 首页 > news >正文

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.优先选择​​组合​​而非多层继承

http://www.xdnf.cn/news/11359.html

相关文章:

  • ARINC818协议的帧格式
  • 如何构建跨平台可复用的业务逻辑层(Web、App、小程序)
  • Elasticsearch倒排索引与传统索引对比
  • iOS 冷启动时间监控:启动起点有哪些选择?
  • OpenBMC:BmcWeb log输出
  • 消息中间件——RocketMQ(二)
  • git push
  • MySQL快速入门篇---库的操作
  • 2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(二级)答案 + 解析
  • 深入规划 Elasticsearch 索引:策略与实践
  • RFID图书管理系统如何重构数字化仓储管理新生态
  • 【硬件系统架构】冯·诺依曼架构
  • VOIP通信中的错误码
  • 深度学习| Deep Snake环境配置+训练+预测评估(超全面)
  • android 打包内容 安卓打包工具有哪些
  • C++学习:六个月从基础到就业——内存管理:new/delete操作符
  • 中间件--ClickHouse-10--海量数据存储如何抉择ClickHouse和ES?
  • Linux:线程概念与控制
  • PDF.js 生态中如何处理“添加注释\添加批注”以及 annotations.contents 属性
  • 观察者模式详解与C++实现
  • kafka jdbc connector适配kadb数据实时同步
  • Spring Boot 核心注解全解:@SpringBootApplication背后的三剑客
  • 力扣每日打卡 2364. 统计坏数对的数目 (中等)
  • HTTP测试智能化升级:动态变量管理实战与效能跃迁
  • Spring开发系列教程(20)——Spring MVC
  • Flutter 自定义插件基础
  • 【unity实战】Animator启用root motion根运动动画,实现完美的动画动作匹配
  • 精准检测新选择:国产OLI-P偏振串扰分析仪正式发布
  • PHP连接MYSQL数据库
  • easyExcel单元格合并