Параметризованное действие Invoke Delegate - PullRequest
0 голосов
/ 08 мая 2020

У меня есть следующий пример рабочего кода:

public void ClearLogText() => this.TxtLog.Invoke((Action)delegate {this.TxtLog.Text = string.Empty;});

Как мне правильно добавить параметры?

public void SetControlText(Control control, string text) => this.Invoke((Action<Control, string>delegate (Control x, string y) {x.Text = y;});

Проблема, которая у меня есть, заключается в том, как использовать параметры в функции , в данном случае control и text.

Примечание. Метод мог быть любым. Меня волнует концепция, а не то, что делает метод. Это было первое, что пришло в голову.

Visual Studio жалуется на очевидное, а именно на то, что я не использую аргументы в методе.

Я уже знаю, как работать с Actions, например, это ответ. Что меня сбивает, так это части Invoke и delegate.

private void NotifyUser(string message, BalloonTip.BalloonType ballType)
{
    Action<string, BalloonTip.BalloonType> act = 
        (m, b) => BalloonTip.ShowBalloon(m, b);

    act(message, ballType);
}

Я также хотел бы сохранить ответ в одной строке с помощью конструкции this.X.Invoke((Action)delegate..., поэтому этот вопрос, иначе ответ был бы быть:

    public delegate void DelegateSetControlText(Control control, string text);

    public void SetControlText(Control control, string text)
    {
        if (true == this.InvokeRequired)
        {
            Program.DelegateSetControlText d = new Program.DelegateSetControlText(this.SetControlText);
            this.Invoke(d, new object[] { control, text });
        }
        else
            control.Text = text;
    }

1 Ответ

0 голосов
/ 08 мая 2020

Нет необходимости включать приведение delegate в фактический вызов.
Параметры go во втором аргументе метода Invoke, являясь массивом объектов params, здесь содержащим control и text.

public void SetControlText(Control control, string text)
    => this.Invoke((Action<Control, string>)((ctrl, txt) => ctrl.Text = txt), control, text);
...