Определите, было ли событие прикреплено к

У меня есть два объекта - один, содержащий некоторый код с, вызовет событие, а другой содержит обработчик для этого события. Я не могу "добавить" AddHandler " в Загрузка первого объекта, потому что экземпляр второго объекта еще не существует. Когда я поднимаю событие, я хочу проверить, была ли создана копия объекта 2 (легко сделать) и был ли обработчик еще прикреплен к событию (не знаю, как это сделать).

Я также открыт для другой рекомендации о том, как сделать это вместо этого. Если я сделаю свой AddHandler в Object1.Load, а Object2 еще не существует, то он никогда не обработает мое событие, даже если я создам его позже. Прямо сейчас, в коде, который запускает событие, я только что прибегнул к выполнению RemoveHandler, а затем AddHandler каждый раз, когда происходит событие, и тогда я знаю, что присоединю, когда объект наконец существует, но я знаю это это дерьмовый метод.

Я видел статью о чем-то похожем (Определить список обработчиков событий, связанных с событием) и, возможно, я что-то упустил при переводе, но я не могу заставить код работать над моим настраиваемым событием в VB.NET.

 chrissie118 июн. 2009 г., 16:44
Почему вы не можете пользоваться без всяких событий?
 SqlRyan18 июн. 2009 г., 17:31
Я не уверен, как использование WithEvents повлияет на мою ситуацию - дело не в том, что событие не было вызвано или обработчик не работает должным образом - они оба в порядке. Просто я не могу прикрепить обработчик до тех пор, пока у меня не будет экземпляра объекта, который будет обрабатывать событие, поэтому я не уверен, какое место лучше проверить для этого.

Ответы на вопрос(4)

Решение Вопроса

которое вы проверяете перед подключением события.

if not eventHooked then
 addhandler
 eventHooked = true
end if

Также, если вам нужен хороший конвертер c # в vbhttp://www.tangiblesoftwaresolutions.com/ есть такая, которая может переводить 100 строк на лету или меньше для или переводить проект 1000 строк бесплатно. Более того, вы должны приобрести его, но обычно эти ограничения будут работать нормально. Нет, я не пытаюсь рекламировать их :-)

 SqlRyan18 июн. 2009 г., 22:07
Хотя я надеялся избежать этого решения, оно решает мою проблему и работает как чемпион. Спасибо за вашу помощь.
 SqlRyan18 июн. 2009 г., 17:26
Я обдумал это, и это, вероятно, то, что я пойду с. Я просто подумал, что может быть простой способ обнаружить, если событие уже подключено, но если нет, то это мой предпочтительный метод.

<YourEvent>Event что вы можете использовать для проверки ничего.

Public Event MyClick As EventHandler

Private Sub OnMyClick()
    If MyClickEvent IsNot Nothing Then
        RaiseEvent MyClick(Me, New EventArgs())
    Else
        ' No event handler has been set.
        MsgBox("There is no event handler. That makes me sad.")
    End If
End Sub

http://blogs.msdn.com/b/vbteam/archive/2009/09/25/testing-events-for-nothing-null-doug-rothaus.aspx

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/9ec8ff1c-eb9b-4cb3-8960-9cd4b25434f2 (который, кажется, работает в соответствии с моим тестированием), проверка существующих обработчиков событий выполняется после вызова RaiseEvent. Если вы не хотите вызывать событие и просто должны проверить, подключены ли какие-либо обработчики, вы можете проверить значение скрытой переменной с именем & lt; your_event_name & gt; Event, например:

Public Event Foo As ActionFoo

If FooEvent IsNot Nothing Then...

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

if (MyButton.Click == null)
{
    MyButton.Click += myEventHandler;
}

(Я позволю вам перевести это на VB)

 18 июн. 2009 г., 17:41
@ChrisF: Вот почему мне было интересно, хочет ли он знать,any обработчик был прикреплен (по сравнению с конкретным обработчиком). Может быть, он знает, что он единственный, кто будет к нему прикасаться. @ rwmnau: Насколько я понимаю, к событиям напрямую может обращаться только их объявленный класс, поэтому этот код должен быть помещен в сам класс.
 18 июн. 2009 г., 16:54
Это не сработает, если какое-либо другое событие уже было добавлено.
 SqlRyan18 июн. 2009 г., 17:28
Я делаю это для пользовательского события, а не для стандартного события, и этот код, похоже, не работает в этом случае - проверка значения MyEvent не выполняется синтаксисом, сообщая мне: «Это событие, и оно не может быть вызывается напрямую, так что я даже не могу скомпилировать. Я полагаю, это то, что C # обрабатывает иначе, чем VB ...

Ваш ответ на вопрос