RSS Feed
Download our iPhone app
Browse DevX
Sign up for e-mail newsletters from DevX

Tip of the Day
Language: VB7
Expertise: Advanced
Nov 4, 2002

Set up event handlers through reflection

Reflection makes it easy to invoke a method (or assign a field or a property) by its name. For example, suppose you have the following classes:

Class Person
   Event PropertyChanged(ByVal propertyName As String, ByVal newValue As Object)

   Dim m_Name As String

   Property Name() As String
         Return m_Name
      End Get
      Set(ByVal Value As String)
         If Value <> m_Name Then
            m_Name = Value
            RaiseEvent PropertyChanged("Name", m_Name)
         End If
      End Set
   End Property
End Class
Here's how you can assign a Person's Name and a Car's Color through reflection:

' this code assumes the following statement
' Imports System.Reflection

' create a Person object
Dim pe As New Person()
' note how you can create the array of arguments on the fly
pe.GetType.InvokeMember("Name", BindingFlags.SetProperty, Nothing, pe, _
    New Object() {"John"})
However, setting up an event handler for an event of which you know just the name isn't as immediate. These are the steps you need to follow:

1. Create an event handler that reflects the event syntax
2. Get the EventInfo object corresponding to the event in question
3. Create a delegate to local event handler by means of the Delegate.CreateDelegate method
4. call the EventInfo.AddEventHandler method to establish the connection

Remember to remove the event handler when you don't need to receive events any longer. Here's a complete example that uses the Person class, but it can be easily adapted to other classes:

Module MainModule
   Sub Main
      ' create a Person object
      Dim pe As New Person()
      ' get a reference to the EventInfo for this object
      Dim peEv As EventInfo = pe.GetType.GetEvent("PropertyChanged")
      ' create a delegate to the local procedure
      Dim peDel As [Delegate] = [Delegate].CreateDelegate(peEv.EventHandlerType, _
          Me, "PropertyChanged")
      ' make the local procedure a handler for the event
      peEv.AddEventHandler(pe, peDel)

      ' prove that it works
      pe.Name = "John"

      ' (always remove event handlers)
       peEv.RemoveEventHandler(pe, peDel)
   End Sub

   Private Sub PropertyChanged(ByVal propertyName As String, _
       ByVal newValue As Object)
      Console.WriteLine("Property {0} has changed. The new value is {1}", _
          propertyName, newValue)
   End Sub
End Module
Francesco Balena
Close Icon
Thanks for your registration, follow us on our social networks to keep up-to-date