Создание метода расширения Generic - PullRequest
1 голос
/ 12 июня 2010

В этой публикации есть очень интересный способ обновления потоков пользовательского интерфейса с использованием метода статического расширения.

public static void InvokeIfRequired(this Control c, Action<Control> action)
{
    if(c.InvokeRequired)
    {
        c.Invoke(() => action(c));
    }
    else
    {
        action(c);
    }
}

Что я хочу сделать, так это сделать универсальную версию, чтобы меня не ограничивал элемент управления. Это позволило бы мне сделать следующее, например (потому что я больше не ограничен только контролем)

this.progressBar1.InvokeIfRequired(pb => pb.Value = e.Progress);

Я пробовал следующее:

  public static void InvokeIfRequired<T>(this T c, Action<T> action) where T : Control
    {
        if (c.InvokeRequired)
        {
            c.Invoke(() => action(c));
        }
        else
        {
            action(c);
        }
    }

Но я получаю следующую ошибку, которую не знаю, как исправить. Кто-нибудь какие-либо предложения?

Ошибка 5 Не удалось преобразовать лямбда-выражение в тип «System.Delegate», поскольку оно не является типом делегата

Ответы [ 3 ]

4 голосов
/ 12 июня 2010

заменить:

c.Invoke(() => action(c));

на:

c.Invoke(action, c);
0 голосов
/ 12 июня 2010

Попробуйте этот небольшой вариант:

public static void InvokeIfRequired<T>(this T c, Action<T> action) where T : Control
{
    if (c.InvokeRequired)
    {
        c.Invoke((Action<T>)(() => action(c)));
    }
    else
    {
        action(c);
    }
}

Вам необходимо привести его в тип делегата. Вроде глупо, я знаю. Я не могу дать вам вескую причину, по которой лямбда-выражение неявно присваивается как делегат.

0 голосов
/ 12 июня 2010

Это общеизвестная ошибка с лямбдами и анонимными методами:

Преобразование этого делегата в анонимный метод или лямбда

Ваш код просто нуждается в приведении для компиляции:

public static void InvokeIfRequired<T>(this T c, Action<T> action) where T : Control
{
    if (c.InvokeRequired)
    {
        c.Invoke((Action<T>)((control) => action(control)));
    }
    else
    {
        action(c);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...