Как получить возвращаемое значение функции, вызванной из метода Invoke - PullRequest
1 голос
/ 03 ноября 2011

Мне нужны объяснения .. почему следующий код дает: Parameter count mismatch?

C # Код:

//... 
public delegate int FindInRichTextBoxMethod(RichTextBox rtx, string target, int index);
 public int FindInRichTextBox(RichTextBox rtx, string target, int index)
    {
        return rtx.Find(target, index, RichTextBoxFinds.None);
    }
// ... 
int start; 
string tempState = "foo";

if (lista.InvokeRequired) {
  object find = Invoke((FindInRichTextBoxMethod)delegate
                            {
                                return FindInRichTextBox(list, tempState, len);
                            });  

                            start = (int)find;
} else {

      start = FindInRichTextBox(list, tempState, len);
 }

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 03 ноября 2011

Аргументы для Invoke() включают делегата и аргументы, переданные этому делегату.Вы пытаетесь передать делегат FindInRichTextBoxMethod, но этот тип делегата принимает три аргумента.Вам необходимо:

  1. создать делегат с вашим методом FindInRichTextBox, а затем
  2. передать параметры этому делегату.

Что-то вродеэто:

var finder = new FindInRichTextBoxMethod(FindInRichTextBox);
object find = Invoke(finder, new object[] { list, tempState, len }); 

Другой путь - пройти через замыкание, как будто вы пытаетесь в своем примере.В вашем случае ошибка связана с приведением к FindInRichTextBoxMethod, поэтому Invoke ожидает аргументы.Вместо этого вы можете игнорировать приведение и передачу анонимного делегата, например:

var find = Invoke(delegate { return FindInRichTextBox(list, tempState, len); });

Это не сработает, потому что компилятор не может точно определить, что вы хотите сделать с этим анонимным делегатом.,Точно так же лямбда не может быть автоматически преобразована:

var find = Invoke(() => FindInRichTextBox(list, tempState, len));

Чтобы узнать, как и как решить проблему, прочитайте Почему должно быть приведено лямбда-выражение, если оно передано в виде простого параметра Delegate .

0 голосов
/ 03 ноября 2011

Получаете ли вы это при вызове Invoke ? Я обычно передаю Invoke делегат, а затем массив объектов, содержащий переменные, которые вы хотите передать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...