You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将委托重置为原始代码?无需重复代码的恢复方法

嗨,这个问题其实很常见,核心思路就是提前保存原始委托的引用,等需要恢复的时候直接把保存的引用赋值回去就行,完全不用重复写默认代码。我给你一步步讲清楚:

核心解决方案:提前备份原始委托
  • 第一步:备份原始委托
    在你重写覆盖委托之前,先把原始的委托实例保存到一个变量里——这一步是关键,必须在第一次覆盖前执行,不然你存的会是已经被修改后的版本。比如假设你的委托类型是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:23:34