如何将委托重置为原始代码?无需重复代码的恢复方法
嗨,这个问题其实很常见,核心思路就是提前保存原始委托的引用,等需要恢复的时候直接把保存的引用赋值回去就行,完全不用重复写默认代码。我给你一步步讲清楚:
核心解决方案:提前备份原始委托
第一步:备份原始委托
在你重写覆盖委托之前,先把原始的委托实例保存到一个变量里——这一步是关键,必须在第一次覆盖前执行,不然你存的会是已经被修改后的版本。比如假设你的委托类型是MyDelegate,目标委托字段是targetDelegate,代码可以这么写:// 定义一个变量专门存原始委托 private MyDelegate _originalDelegate; // 在覆盖委托前先备份 _originalDelegate = targetDelegate;第二步:放心覆盖委托
这时候你就可以随意替换成自定义逻辑了,比如:targetDelegate = () => { // 你的自定义处理逻辑 Console.WriteLine("这是覆盖后的委托行为"); };第三步:一键恢复原始逻辑
当需要回到默认代码时,直接把备份的引用赋值回去就行:// 恢复到最初的默认委托逻辑 targetDelegate = _originalDelegate;
额外注意事项
- 如果你的委托是静态字段,那备份变量也得设为静态的,不然实例化后会丢失备份。
- 如果需要支持多次“覆盖-恢复”,要确保备份的是最原始的版本(或者根据需求备份上一次的委托,实现类似“撤销”的效果)。
- 要是你用的是事件委托(比如
event MyDelegate MyEvent),直接备份字段可能不行——因为事件是封装过的。这种情况可以在添加自定义处理程序前,先记录原始的订阅列表,或者移除自定义处理后确保原始逻辑仍在订阅中。
给你一个完整的可运行示例:
using System; public delegate void MyDelegate(); public class DelegateDemo { // 原始默认委托逻辑 public MyDelegate targetDelegate = () => Console.WriteLine("原始默认逻辑"); private MyDelegate _originalDelegate; public void OverrideToCustom() { // 先备份再覆盖 _originalDelegate = targetDelegate; targetDelegate = () => Console.WriteLine("自定义委托逻辑"); } public void RestoreToOriginal() { // 一键恢复 targetDelegate = _originalDelegate; } } // 调用测试 public class Program { public static void Main() { var demo = new DelegateDemo(); demo.targetDelegate(); // 输出:原始默认逻辑 demo.OverrideToCustom(); demo.targetDelegate(); // 输出:自定义委托逻辑 demo.RestoreToOriginal(); demo.targetDelegate(); // 输出:原始默认逻辑 } }
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

