Установка действия из параметра функции является нулевой - PullRequest
0 голосов
/ 02 октября 2018

У меня есть некоторые действия в представлении.

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

, и я пытаюсь установить эти действия внутри другого класса, передавая их в качестве параметра (я не хочу передавать весь класс)

_reloader.SetupActions(Show, Hide);

Reloader является абстрактным, потому что могут быть разные способы обработки поведения Hide / Show в зависимости от сценария, в котором мы находимся.

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
}

И длятекущее представление, я мог бы использовать RapidReloader, SafeReloader и т. д. Этот бит не имеет значения, за исключением того, что внедренный перегрузчик специфичен для текущего представления.

Теперь моя проблема проста и логична:когда я нахожусь в SetupActions, все параметры равны нулю (потому что Действия не были установлены), и установка Show в null, очевидно, не работает.

Что я могу сделать, чтобы, когда Show.Invoke () происходил с моим представлением, вызывался ShowCode из соответствующего перегрузчика?Я хотел бы избежать передачи всего представления в качестве параметра.

Кроме того, если у вас есть лучший дизайн, я все уши.Мы можем быть в XY проблеме ситуации

1 Ответ

0 голосов
/ 02 октября 2018

Вам нужно будет использовать System.ValueTuple пакет nuget, если вы не используете .Net Framework 4.7 или новее.

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;
    }
}
...