Обработка событий C # / Регистрация обратного вызова - PullRequest
1 голос
/ 01 апреля 2010

События могут возвращать только void и получать объект-отправитель / eventargs, верно?

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

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

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

Something::GiveCallBack(Action? funcPtr)

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

Ответы [ 4 ]

0 голосов
/ 09 апреля 2010

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

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

0 голосов
/ 01 апреля 2010

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

открытый делегат void CallbackDelegate (что-то с); публичное событие CallbackDelegate myCallback

public void myFunction () { if (myCallback! = null) myCallback (новое что-то ()); }

ознакомьтесь с руководством по MSDN ... http://msdn.microsoft.com/en-us/library/aa645739(VS.71).aspx

0 голосов
/ 01 апреля 2010

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

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

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

public delegate double PerformAverageEventHandler(int val1, int val2, int val3);
0 голосов
/ 01 апреля 2010

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

...