GetInvocationList события в VB.NET - PullRequest
       17

GetInvocationList события в VB.NET

8 голосов
/ 29 января 2010

Я пытаюсь изучить некоторые принципы WCF, следуя примеру приложения WCF (от Sacha Barber).

Теперь я хотел бы преобразовать следующую функцию в VB.NET

private void BroadcastMessage(ChatEventArgs e)
{

    ChatEventHandler temp = ChatEvent;

    if (temp != null)
    {
        foreach (ChatEventHandler handler in temp.GetInvocationList())
        {
            handler.BeginInvoke(this, e, new AsyncCallback(EndAsync), null);
        }
    }
}

но у меня есть некоторые проблемы, потому что следующий код не принят компилятором

Private Sub BroadcastMessage(ByVal e As ChatEventArgs)

    Dim handlers As EventHandler(Of ChatEventArgs) = ChatEvent

    If handlers IsNot Nothing Then

        For Each handler As EventHandler(Of ChatEventArgs) In handlers.GetInvocationList()

            handler.BeginInvoke(Me, e, New AsyncCallback(AddressOf EndAsync), Nothing)

        Next

    End If

End Sub

сказано

Публичное общее событие ChatEvent (отправитель As Object, e As ChatEventArgs) 'является событие, и не может быть вызван напрямую

Кстати, тогда возможно ли в VB.NET связывать обработчики с определенным событием каким-либо другим способом?

Ответы [ 2 ]

8 голосов
/ 30 января 2010

использовать ChatEventEvent (или EventName Event)

Это не будет отображаться в intellisense, но члены его будут.

VB.NET создает закулисную переменную, чтобы скрыть сложность от кодера ...

Это доступно только в классе, который объявляет событие (или, возможно, его потомки)

6 голосов
/ 29 января 2010

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

Что происходит

Рассмотрим это заявление:

Public Event MyEvent as EventHandler

Достаточно просто, верно?Однако на самом деле это так (вы просто этого не видите)

Private compilerGeneratedName as EventHandler

Public Event MyEvent as EventHandler
    AddHandler(ByVal value as EventHandler)
        compilerGeneratedName += value
    End AddHandler
    RemoveHandler(ByVal value as EventHandler)
        compilerGeneratedName -= value
    End RemoveHandler
    RaiseEvent(ByVal sender as Object, ByVal e as EventArgs)
        compilerGeneratedName.Invoke(sender, e)
    End RaiseEvent
End Event

И когда вы вызываете событие:

RaiseEvent MyEvent(Me, EventArgs.Emtpy)

На самом деле он вызывает код вRaiseEvent block.

Edit

Если события в VB.NET не могут быть обработаны как переменные в любом месте (их можно рассматривать какпеременные в объявленном классе в C #, поэтому ваш пример C # компилируется), тогда вам придется явно реализовать событие самостоятельно.См. Страницу MSDN в операторе Event для получения дополнительной информации о том, как это сделать.Короче говоря, вы захотите каким-то образом хранить несколько обработчиков событий (или использовать один обработчик событий вместе с GetInvocationList, как вы пытаетесь это сделать сейчас).В ваших кодовых блоках AddHandler и RemoveHandler вы добавляете и удаляете из списка обработчиков событий (соответственно).

Вы можете использовать что-то вроде этого:

Private myEventList as New List(Of EventHandler)

Public Custom Event MyEvent as EventHandler
    AddHandler(ByVal value as EventHandler)
        myEventList.Add(value)
    End AddHandler
    RemoveHandler(ByVal value as EventHandler)
        myEventList.Remove(value)
    End RemoveHandler
    RaiseEvent(ByVal sender as Object, ByVal e as EventArgs)
        For Each evt in myEventList
           evt.BeginInvoke(sender, e, New AsyncCallback(AddressOf EndAsync), Nothing)
        Next
    EndRaiseEvent
End Event

Так что теперь, если вы позвоните

RaiseEvent MyEvent(Me, EventArgs.Emtpy)

, это поднимет событие так, как вы ожидаете.

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