Определить объект отправителя из обработчика события - PullRequest
2 голосов
/ 21 июня 2011

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

Как я могу из обработчика события определить, какой объект вызвал событие? как получить ссылку на этот объект? Можно ли это сделать с помощью отражения?

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 22 июня 2011

Лучший способ сделать это - использовать шаблон адаптера.Вы должны создать класс внутри вашего кода, который обернет создаваемый вами COM-класс, который содержит собственное событие, которое может предоставить более подробную информацию.Каждый экземпляр вашего класса будет создавать свой собственный экземпляр класса COM, обрабатывать события COM и генерировать свои собственные события для остальной части вашего кода.Итак, вы не знаете точно, какой COM-класс вызывает событие, но вы точно знаете, какой из ваших экземпляров класса это.

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

public class MyClass
{
   private COMClass instance;
   public event EventHandler<BetterEventArgs> MyBetterEvent;

   public MyClass()
   {
      instance.event += new EventHandler(Handle_COM_event); // ... or whatever
   }

   public void Handle_COM_event(EventArgs)
   {
      if(MyBetterEvent != null) MyBetterEvent(this, new BetterEventArgs());
   }

}
0 голосов
/ 22 июня 2011

Вы можете использовать решение drharris, которое кажется более общим и «более понятным», или вы можете использовать анонимных делегатов:

MyComClass cl = new MyComClass();

cl.MyEvent += new MyComClassDelegate(delegate(MyEventArgs args){ RealHandler(cl, args);})

Теперь ваш RealHandler получит исходные аргументы и объект, вызвавший событие.

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

0 голосов
/ 22 июня 2011

Попробуйте это на форумах MSDN или другим способом в Google "C # динамическое приведение или приведение"

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