Обобщения C # 2.0: Как создать объект Action с нулевыми параметрами - PullRequest
8 голосов
/ 19 июля 2009

Прежде всего, я использую VS2005 и C # 2.0.

Я пытаюсь установить свойство Text в поле со списком внутри события SelectedIndexChanged.Из другого потока здесь, в StackOverflow, это было предложено следующим образом:

BeginInvoke(new Action(() => someCombobox.Text = "x" )); 

Теперь, во-первых, это возвращает мне ошибку компилятора.Я считаю, что это потому, что объект Action ведет себя по-разному в двух языковых спецификациях.В C # 2.0 объекту Action, похоже, требуется структура <T> во всех объявлениях.Может быть, я ошибаюсь, но я хотел бы, чтобы это разъяснили.

Что работает, так это:

BeginInvoke(new Action<string>( delegate { someCombobox.Text = "x"; }), new object[] { "" });

Однако мне просто кажется очень странным, что я должен определить объект Action с параметром типа (тем более что я не собираюсь передавать какие-либо параметры)!Каким-то образом удаление этого параметра также сделает пустой новый объект [] устаревшим, чего я и хочу.

Может кто-нибудь помочь мне упростить приведенный выше вызов?

Наконец, гарантируется ли, что BeginInvokeзакончите после SelectedIndexChanged и, таким образом, обновите свойство Text поля со списком, указав правильный текст?

Буду очень признателен за ответы на эти вопросы.

Ответы [ 2 ]

10 голосов
/ 19 июля 2009

Вы можете определить свой собственный делегат Action.

delegate void Action()

Я не вижу объект, для которого вы вызываете BeginInvoke, но если это элемент управления пользовательского интерфейса, созданный в том же потоке, что и поле со списком, передаваемый вами делегат гарантированно будет вызван через некоторое время после обработчика события SelectedIndexChanged завершается.

10 голосов
/ 19 июля 2009

Я не думаю, что действие без параметров доступно в .NET 2.0 Не беспокойтесь - просто используйте другой предопределенный тип делегата. MethodInvoker должен выполнить эту работу (метод void без параметров).

Кроме того, BeginInvoke имеет 2 перегрузки - одну, которая принимает делегат, и одну, которая принимает делегат и массив объектов.

BeginInvoke(new MethodInvoker(delegate()
{
    someCombobox.Text = "x";
}));
...