【问题标题】:How to reset delegate to original code如何将委托重置为原始代码
【发布时间】:2018-02-21 17:17:31
【问题描述】:

给定这个委托

public class XYZ
{
    public static Action<Profile> DoSomething = (profile) =>
    {
        //some default code here
        return;
    };
}

在我的主要执行中的某个时候,我用这个覆盖它:

XYZ.DoSomething = (currProfile) => 
{
    // some overriding code here
}

如何在需要时将代码设置回原始默认代码而不重复代码?

【问题讨论】:

  • 创建一个您可以调用的方法,将默认值(即原始值)分配给属性。您可以从构造函数调用该方法以确保初始化。
  • AFAIK 除非您将原始文件保存在不同的变量中,否则您不能这样做。编辑:好的,肯尼斯是对的。
  • 如果这是临时交换,您也可以将原始数据分配给一个变量,然后再将其分配回去。真的取决于你如何使用它。
  • 这不是特定于委托的,如果变量是 intstring...
  • 我可以投反对票,但没有任何解释很难纠正错误。知道为什么吗?

标签: c# lambda delegates


【解决方案1】:

这是一个从不使用公共字段的好理由...

一旦你设置它;它消失了。您可以保留原始值:

var originalAction = XYZ.DoSomething;
XYZ.DoSomething = ...;
XYZ.DoSomething = originalAction;

然而,依赖客户端代码来处理这个问题通常是个坏主意;因此,如果我正在编写它,我会像这样公开为一个属性:

public Action<X> DoSomethingOverride {get; set;}
public Action<X> DoSomething => doSomethingOverride ?? DefaultMethod;
private void DefaultMethod (X param)
{
}

还有许多其他方法可以处理此问题,但都涉及存储原始方法。处理这个问题的所有好方法都将使用一个属性来确保只有声明类实际上设置了DoSomething 方法,并且可以重置为默认值。

总计;因为这是static,所以设置该操作将影响所有使用此类的东西。这是稍后要求的错误;不要那样做。

【讨论】:

  • 同意静态评论。不过在这种情况下不是问题。
【解决方案2】:

也许是这样的?

public static Action<Profile> _doSomethingBase = (profile) =>
{
    //some default code here
    return;
};

public static Action<Profile> _doSomething = _doSomethingBase;

public static Action<Profile> DoSomething
{
    get => _doSomething;
    set => _doSomething = value;
}

public static void RevertDoSomething()
{
    DoSomething = _doSomethingBase;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多