2010-04-01 2 views
1

События могут возвращать только пустоту и получать отправитель объекта/eventargs правильно?Обработка событий C#/Регистрация обратного вызова

Если да, то craptastic .... как я могу передать указатель на функцию другого OBJ, как:

public bool ACallBackFunc(int n) 
{ 
    return n > 0; 
} 

public void RegisterCallback(Something s) 
{ 
    s.GiveCallBack(this.ACallBackFunc); 
} 

Something::GiveCallBack(Action? funcPtr) 

Я попытался с помощью Action, но мне нужно, чтобы вернуть некоторое значение и Action s может только return void. Кроме того, мы не знаем, какой обратный вызов мы получим; он мог бы вернуть что угодно и иметь какие-то параметры! Отражение нужно будет использовать так или иначе, как я считаю.

ответ

0

Я написал события, которые возвращают значение, обычно bool. Однако использование Func позволит вернуть значения.

+0

В качестве примера можно привести разъяснение вашего значения. –

+0

Func <> Кажется, что мне нужно знать тип возврата раньше времени ... мы могли бы зарегистрировать неизвестное значение возвращаемой функции. –

+0

Попробуйте 'Func '. Это получает любое количество аргументов любого типа (через массив объектов, например, при использовании ключевого слова 'params') и возвращает аргумент любого типа. –

0

вам нужно создать делегат, который проходит назад классы, которые вас интересуют

общественного делегата недействительными CallbackDelegate (что-то с); общественного мероприятия CallbackDelegate myCallback

общественный недействительный туРипсЫоп() { если (! MyCallback = нуль) myCallback (новое что-то()); }

проверка из MSDN учебника ... http://msdn.microsoft.com/en-us/library/aa645739(VS.71).aspx

0

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

Если вы хотите, чтобы вернуть значение, используйте Func или если вы просто хотите, чтобы вернуть логическое значение и принимать один аргумент, вы можете использовать Predicate

Или вы можете определить делегат в любом случае вы хотите, чтобы вернуть недействительными или значение и принять любое количество аргументов. Вы можете определить делегат, как показано ниже, и он похож на тип, который вы можете использовать. Затем вы можете передать его как параметр обратного вызова без использования Action, Func или Predicate. Пользовательский делегат также широко используется для записи пользовательского обработчика событий многоадресной рассылки.

public delegate double PerformAverageEventHandler(int val1, int val2, int val3); 
0

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

Некоторые идеи, чтобы обойти это, - передать ссылочный объект обработчику событий, сохраняя ссылку на объект. Вы могли бы получить результат, но вам понадобилось бы другое событие, чтобы узнать, когда объект был изменен. Но, вероятно, было бы лучшей идеей переосмыслить все, что вы пытаетесь выполнить. Это звучит как рецепт переполнения стека, когда вы оказываетесь в бесконечном цикле события, вызывающего изменение, которое затем вызывает событие.

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