通过功能参数设置操作为空

时间:2018-10-02 15:15:51

标签: c# events delegates action

我在视图中有一些操作。

public class AView
{
    public Action Show { get; set; }
    public Action Hide { get; set; }
}

并且我试图通过将它们作为参数传递来设置其他类中的动作(我不想传递整个类)

_reloader.SetupActions(Show, Hide);

Reloader是抽象的,因为根据我们所处的场景,可能会有不同的方式来处理“隐藏/显示”的行为方式。

public abstract class Reloader : IReloader
{
    public void SetupActions(Action show, Action hide)
    {
        show = Show;
        hide = Hide;
    }

    protected virtual void Show() { ... } //what should be done when Show is invoked
    protected virtual void Hide() { ... } //same for Hiding
}

对于当前视图,我可能正在使用RapidReloaderSafeReloader等。该位无关紧要,只是注入的重新加载器特定于当前视图。

现在我的问题很简单且逻辑合理:当我进入SetupActions时,所有参数均为空(因为尚未设置操作),并且显然将Show设置为null不起作用。

我该怎么办,以便当Show.Invoke()出现在我的视图中时,从相关的重新加载器中调用ShowCode?我想避免将整个视图作为参数传递。

此外,如果您有更好的设计,我会全力以赴。我们可能处于XY problem情况下

1 个答案:

答案 0 :(得分:1)

如果您不使用.Net Framework 4.7或更高版本,则需要使用System.ValueTuple nuget程序包。

public interface IReloader
{
    (Action Show, Action Hide) GetActions();
}


public abstract class Reloader : IReloader
{
    public (Action Show, Action Hide) GetActions()
    {
        return (Show, Hide);
    }

    protected virtual void Show() { }

    protected virtual void Hide() { }
}


public class FastReloader : Reloader { }


public class AView
{
    public Action Show{ get; set; }
    public Action Hide{ get; set; }


    public void IwantTheNewActions()
    {
        var reloader = new FastReloader();
        var actions = reloader.GetActions();
        Show = actions.Show;
        Hide = actions.Hide;
    }
}