2013-02-15 2 views
1

Я пытаюсь использовать Action<string, bool> тип делегата для вызова Dispatcher.InvokeDispatcher.Invoke с делегатом действий

Названный метод для использования с detegate

private void SomeMethod(string name,out bool result) 
{ 
    ... 
} 

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

Dispatcher.Invoke(new Action<string, bool>(SomeMethod),new Object[2]{name, result}); 

Что я не так здесь делаю. Пожалуйста, поправьте меня.

ответ

2

Action<,> не имеет параметра out. Вы должны были бы использовать свой собственный делегат, как это:

public void ActionOut<T1, T2>(T1 input, out T2 output) 

That мощь работы (с точки зрения не бросать исключение) - я уверен, что это было бы с отражением; Я не уверен, что с Dispatcher.Invoke. Он не будет оставить значение результата в переменной result, хотя - он оставит его в массиве, который вы игнорируете. Вы бы хотели:

object[] args = new object[] { name, null }; 
Dispatcher.Invoke(new ActionOut<string, bool>(SomeMethod), args); 
result = (bool) args[1]; 

Но было бы лучше просто сделать метод вернуть результат, и использовать вместо Func<string, bool>. Вы должны почти никогда использовать параметр out в методе, который возвращает void. На мой взгляд, параметры out эффективно предназначены для того, чтобы вы могли вернуть более одного значения - если вы хотите вернуть только одно значение, используйте тип возвращаемого значения!

+0

Хорошо. Я понял, что не так, что я пытаюсь сделать. Ваш ответ полностью касается моей проблемы. Я буду использовать 'Func '. Спасибо за ответ. –

Смежные вопросы