Atlanta Custom Software Development 

 
   Search        Code/Page
 

User Login
Email

Password

 

Forgot the Password?
Services
» Web Development
» Maintenance
» Data Integration/BI
» Information Management
Programming
  Database
Automation
OS/Networking
Graphics
Links
Tools
» Regular Expr Tester
» Free Tools

Set up event handlers through reflection

Total Hit ( 2525)

Rate this article:     Poor     Excellent 

 Submit Your Question/Comment about this article

Rating


 


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:

Click here to copy the following block
Class Person
  Event PropertyChanged(ByVal propertyName As String, ByVal newValue As Object)

  Dim m_Name As String

  Property Name() As String
   Get
     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:

Click here to copy the following block
' 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:

Click here to copy the following block
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


Submitted By : Nayan Patel  (Member Since : 5/26/2004 12:23:06 PM)

Job Description : He is the moderator of this site and currently working as an independent consultant. He works with VB.net/ASP.net, SQL Server and other MS technologies. He is MCSD.net, MCDBA and MCSE. In his free time he likes to watch funny movies and doing oil painting.
View all (893) submissions by this author  (Birth Date : 7/14/1981 )


Home   |  Comment   |  Contact Us   |  Privacy Policy   |  Terms & Conditions   |  BlogsZappySys

© 2008 BinaryWorld LLC. All rights reserved.