Author:水如烟
使用代码示例:
Public
Class
Form1
Private Sub box1TextChanged( ByVal sender As System.Object, ByVal e As System.EventArgs)
Send( Me .TextBox1.Text)
End Sub
Private Sub Send( ByVal s As String )
TestClass.Receive(s)
End Sub
Private Sub Button1_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Common.AddEventHandler( " TextChanged " , Me .TextBox1, " box1TextChanged " , Me )
End Sub
Private Sub Button2_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Common.RemoveEventHandler( " TextChanged " , Me .TextBox1, " box1TextChanged " , Me )
End Sub
Private Sub Button3_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Common.AddEventHandler( " MyEvent " , GetType (TestClass), " ShowMessage " , GetType (TestClass))
End Sub
Private Sub Button4_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Common.RemoveEventHandler( " MyEvent " , GetType (TestClass), " ShowMessage " , GetType (TestClass))
End Sub
End Class
Private Sub box1TextChanged( ByVal sender As System.Object, ByVal e As System.EventArgs)
Send( Me .TextBox1.Text)
End Sub
Private Sub Send( ByVal s As String )
TestClass.Receive(s)
End Sub
Private Sub Button1_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Common.AddEventHandler( " TextChanged " , Me .TextBox1, " box1TextChanged " , Me )
End Sub
Private Sub Button2_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Common.RemoveEventHandler( " TextChanged " , Me .TextBox1, " box1TextChanged " , Me )
End Sub
Private Sub Button3_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Common.AddEventHandler( " MyEvent " , GetType (TestClass), " ShowMessage " , GetType (TestClass))
End Sub
Private Sub Button4_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Common.RemoveEventHandler( " MyEvent " , GetType (TestClass), " ShowMessage " , GetType (TestClass))
End Sub
End Class
类:
Imports
System.Reflection
Namespace uReflection
Public Class Common
Private Sub New ()
End Sub
' '' <summary>
' '' 添加事件绑定
' '' </summary>
' '' <param name="eventName">事件名称</param>
' '' <param name="target">事件所在实例</param>
' '' <param name="methodName">方法名称</param>
' '' <param name="instance">方法所在实例</param>
' '' <remarks></remarks>
Public Shared Sub AddEventHandler( ByVal eventName As String , ByVal target As Object , ByVal methodName As String , ByVal instance As Object )
Dim mBinding As Reflection.BindingFlags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.NonPublic Or BindingFlags.Static
' 取事件信息
Dim mEventInfo As Reflection.EventInfo = target.GetType.GetEvent(eventName, mBinding)
' 取方法信息
Dim mMethodInfo As Reflection.MethodInfo = instance.GetType.GetMethod(methodName, mBinding)
Dim d As [ Delegate ]
If mMethodInfo.IsStatic Then
' 静态方法的委托申请
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, Nothing , mMethodInfo)
Else
' 实例方法的委托申请
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, instance, mMethodInfo)
End If
'移除
mEventInfo.AddEventHandler(target, d)
End Sub
' '' <summary>
' '' 添加事件绑定
' '' </summary>
' '' <param name="eventName">事件名称</param>
' '' <param name="target">事件所在实例</param>
' '' <param name="methodName">方法名称</param>
' '' <param name="instance">方法所在静态类</param>
' '' <remarks></remarks>
Public Shared Sub AddEventHandler( ByVal eventName As String , ByVal target As Object , ByVal methodName As String , ByVal instance As Type)
Dim mBinding As Reflection.BindingFlags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.NonPublic Or BindingFlags.Static
Dim mEventInfo As Reflection.EventInfo = target.GetType.GetEvent(eventName, mBinding)
Dim mMethodInfo As Reflection.MethodInfo = instance.GetMethod(methodName, mBinding)
Dim d As [ Delegate ]
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, Nothing , mMethodInfo)
mEventInfo.AddEventHandler(target, d)
End Sub
' '' <summary>
' '' 添加事件绑定
' '' </summary>
' '' <param name="eventName">事件名称</param>
' '' <param name="target">事件所在静态类</param>
' '' <param name="methodName">方法名称</param>
' '' <param name="instance">方法所在实例</param>
' '' <remarks></remarks>
Public Shared Sub AddEventHandler( ByVal eventName As String , ByVal target As Type, ByVal methodName As String , ByVal instance As Object )
Dim mBinding As Reflection.BindingFlags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.NonPublic Or BindingFlags.Static
Dim mEventInfo As Reflection.EventInfo = target.GetEvent(eventName, mBinding)
Dim mMethodInfo As Reflection.MethodInfo = instance.GetType.GetMethod(methodName, mBinding)
Dim d As [ Delegate ]
If mMethodInfo.IsStatic Then
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, Nothing , mMethodInfo)
Else
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, instance, mMethodInfo)
End If
mEventInfo.AddEventHandler(target, d)
End Sub
' '' <summary>
' '' 添加事件绑定
' '' </summary>
' '' <param name="eventName">事件名称</param>
' '' <param name="target">事件所在静态类</param>
' '' <param name="methodName">方法名称</param>
' '' <param name="instance">方法所在静态类</param>
' '' <remarks></remarks>
Public Shared Sub AddEventHandler( ByVal eventName As String , ByVal target As Type, ByVal methodName As String , ByVal instance As Type)
Dim mBinding As Reflection.BindingFlags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.NonPublic Or BindingFlags.Static
Dim mEventInfo As Reflection.EventInfo = target.GetEvent(eventName, mBinding)
Dim mMethodInfo As Reflection.MethodInfo = instance.GetMethod(methodName, mBinding)
Dim d As [ Delegate ]
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, Nothing , mMethodInfo)
mEventInfo.AddEventHandler(target, d)
End Sub
' '' <summary>
' '' 移除事件绑定
' '' </summary>
' '' <param name="eventName">事件名称</param>
' '' <param name="target">事件所在实例</param>
' '' <param name="methodName">方法名称</param>
' '' <param name="instance">方法所在实例</param>
' '' <remarks></remarks>
Public Shared Sub RemoveEventHandler( ByVal eventName As String , ByVal target As Object , ByVal methodName As String , ByVal instance As Object )
Dim mBinding As Reflection.BindingFlags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.NonPublic Or BindingFlags.Static
' 取事件信息
Dim mEventInfo As Reflection.EventInfo = target.GetType.GetEvent(eventName, mBinding)
' 取方法信息
Dim mMethodInfo As Reflection.MethodInfo = instance.GetType.GetMethod(methodName, mBinding)
Dim d As [ Delegate ]
If mMethodInfo.IsStatic Then
' 静态方法的委托申请
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, Nothing , mMethodInfo)
Else
' 实例方法的委托申请
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, instance, mMethodInfo)
End If
' 绑定
mEventInfo.RemoveEventHandler(target, d)
End Sub
' '' <summary>
' '' 移除事件绑定
' '' </summary>
' '' <param name="eventName">事件名称</param>
' '' <param name="target">事件所在实例</param>
' '' <param name="methodName">方法名称</param>
' '' <param name="instance">方法所在静态类</param>
' '' <remarks></remarks>
Public Shared Sub RemoveEventHandler( ByVal eventName As String , ByVal target As Object , ByVal methodName As String , ByVal instance As Type)
Dim mBinding As Reflection.BindingFlags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.NonPublic Or BindingFlags.Static
Dim mEventInfo As Reflection.EventInfo = target.GetType.GetEvent(eventName, mBinding)
Dim mMethodInfo As Reflection.MethodInfo = instance.GetMethod(methodName, mBinding)
Dim d As [ Delegate ]
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, Nothing , mMethodInfo)
mEventInfo.RemoveEventHandler(target, d)
End Sub
' '' <summary>
' '' 移除事件绑定
' '' </summary>
' '' <param name="eventName">事件名称</param>
' '' <param name="target">事件所在静态类</param>
' '' <param name="methodName">方法名称</param>
' '' <param name="instance">方法所在实例</param>
' '' <remarks></remarks>
Public Shared Sub RemoveEventHandler( ByVal eventName As String , ByVal target As Type, ByVal methodName As String , ByVal instance As Object )
Dim mBinding As Reflection.BindingFlags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.NonPublic Or BindingFlags.Static
Dim mEventInfo As Reflection.EventInfo = target.GetEvent(eventName, mBinding)
Dim mMethodInfo As Reflection.MethodInfo = instance.GetType.GetMethod(methodName, mBinding)
Dim d As [ Delegate ]
If mMethodInfo.IsStatic Then
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, Nothing , mMethodInfo)
Else
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, instance, mMethodInfo)
End If
mEventInfo.RemoveEventHandler(target, d)
End Sub
' '' <summary>
' '' 移除事件绑定
' '' </summary>
' '' <param name="eventName">事件名称</param>
' '' <param name="target">事件所在静态类</param>
' '' <param name="methodName">方法名称</param>
' '' <param name="instance">方法所在静态类</param>
' '' <remarks></remarks>
Public Shared Sub RemoveEventHandler( ByVal eventName As String , ByVal target As Type, ByVal methodName As String , ByVal instance As Type)
Dim mBinding As Reflection.BindingFlags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.NonPublic Or BindingFlags.Static
Dim mEventInfo As Reflection.EventInfo = target.GetEvent(eventName, mBinding)
Dim mMethodInfo As Reflection.MethodInfo = instance.GetMethod(methodName, mBinding)
Dim d As [ Delegate ]
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, Nothing , mMethodInfo)
mEventInfo.RemoveEventHandler(target, d)
End Sub
End Class
End Namespace
Namespace uReflection
Public Class Common
Private Sub New ()
End Sub
' '' <summary>
' '' 添加事件绑定
' '' </summary>
' '' <param name="eventName">事件名称</param>
' '' <param name="target">事件所在实例</param>
' '' <param name="methodName">方法名称</param>
' '' <param name="instance">方法所在实例</param>
' '' <remarks></remarks>
Public Shared Sub AddEventHandler( ByVal eventName As String , ByVal target As Object , ByVal methodName As String , ByVal instance As Object )
Dim mBinding As Reflection.BindingFlags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.NonPublic Or BindingFlags.Static
' 取事件信息
Dim mEventInfo As Reflection.EventInfo = target.GetType.GetEvent(eventName, mBinding)
' 取方法信息
Dim mMethodInfo As Reflection.MethodInfo = instance.GetType.GetMethod(methodName, mBinding)
Dim d As [ Delegate ]
If mMethodInfo.IsStatic Then
' 静态方法的委托申请
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, Nothing , mMethodInfo)
Else
' 实例方法的委托申请
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, instance, mMethodInfo)
End If
'移除
mEventInfo.AddEventHandler(target, d)
End Sub
' '' <summary>
' '' 添加事件绑定
' '' </summary>
' '' <param name="eventName">事件名称</param>
' '' <param name="target">事件所在实例</param>
' '' <param name="methodName">方法名称</param>
' '' <param name="instance">方法所在静态类</param>
' '' <remarks></remarks>
Public Shared Sub AddEventHandler( ByVal eventName As String , ByVal target As Object , ByVal methodName As String , ByVal instance As Type)
Dim mBinding As Reflection.BindingFlags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.NonPublic Or BindingFlags.Static
Dim mEventInfo As Reflection.EventInfo = target.GetType.GetEvent(eventName, mBinding)
Dim mMethodInfo As Reflection.MethodInfo = instance.GetMethod(methodName, mBinding)
Dim d As [ Delegate ]
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, Nothing , mMethodInfo)
mEventInfo.AddEventHandler(target, d)
End Sub
' '' <summary>
' '' 添加事件绑定
' '' </summary>
' '' <param name="eventName">事件名称</param>
' '' <param name="target">事件所在静态类</param>
' '' <param name="methodName">方法名称</param>
' '' <param name="instance">方法所在实例</param>
' '' <remarks></remarks>
Public Shared Sub AddEventHandler( ByVal eventName As String , ByVal target As Type, ByVal methodName As String , ByVal instance As Object )
Dim mBinding As Reflection.BindingFlags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.NonPublic Or BindingFlags.Static
Dim mEventInfo As Reflection.EventInfo = target.GetEvent(eventName, mBinding)
Dim mMethodInfo As Reflection.MethodInfo = instance.GetType.GetMethod(methodName, mBinding)
Dim d As [ Delegate ]
If mMethodInfo.IsStatic Then
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, Nothing , mMethodInfo)
Else
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, instance, mMethodInfo)
End If
mEventInfo.AddEventHandler(target, d)
End Sub
' '' <summary>
' '' 添加事件绑定
' '' </summary>
' '' <param name="eventName">事件名称</param>
' '' <param name="target">事件所在静态类</param>
' '' <param name="methodName">方法名称</param>
' '' <param name="instance">方法所在静态类</param>
' '' <remarks></remarks>
Public Shared Sub AddEventHandler( ByVal eventName As String , ByVal target As Type, ByVal methodName As String , ByVal instance As Type)
Dim mBinding As Reflection.BindingFlags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.NonPublic Or BindingFlags.Static
Dim mEventInfo As Reflection.EventInfo = target.GetEvent(eventName, mBinding)
Dim mMethodInfo As Reflection.MethodInfo = instance.GetMethod(methodName, mBinding)
Dim d As [ Delegate ]
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, Nothing , mMethodInfo)
mEventInfo.AddEventHandler(target, d)
End Sub
' '' <summary>
' '' 移除事件绑定
' '' </summary>
' '' <param name="eventName">事件名称</param>
' '' <param name="target">事件所在实例</param>
' '' <param name="methodName">方法名称</param>
' '' <param name="instance">方法所在实例</param>
' '' <remarks></remarks>
Public Shared Sub RemoveEventHandler( ByVal eventName As String , ByVal target As Object , ByVal methodName As String , ByVal instance As Object )
Dim mBinding As Reflection.BindingFlags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.NonPublic Or BindingFlags.Static
' 取事件信息
Dim mEventInfo As Reflection.EventInfo = target.GetType.GetEvent(eventName, mBinding)
' 取方法信息
Dim mMethodInfo As Reflection.MethodInfo = instance.GetType.GetMethod(methodName, mBinding)
Dim d As [ Delegate ]
If mMethodInfo.IsStatic Then
' 静态方法的委托申请
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, Nothing , mMethodInfo)
Else
' 实例方法的委托申请
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, instance, mMethodInfo)
End If
' 绑定
mEventInfo.RemoveEventHandler(target, d)
End Sub
' '' <summary>
' '' 移除事件绑定
' '' </summary>
' '' <param name="eventName">事件名称</param>
' '' <param name="target">事件所在实例</param>
' '' <param name="methodName">方法名称</param>
' '' <param name="instance">方法所在静态类</param>
' '' <remarks></remarks>
Public Shared Sub RemoveEventHandler( ByVal eventName As String , ByVal target As Object , ByVal methodName As String , ByVal instance As Type)
Dim mBinding As Reflection.BindingFlags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.NonPublic Or BindingFlags.Static
Dim mEventInfo As Reflection.EventInfo = target.GetType.GetEvent(eventName, mBinding)
Dim mMethodInfo As Reflection.MethodInfo = instance.GetMethod(methodName, mBinding)
Dim d As [ Delegate ]
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, Nothing , mMethodInfo)
mEventInfo.RemoveEventHandler(target, d)
End Sub
' '' <summary>
' '' 移除事件绑定
' '' </summary>
' '' <param name="eventName">事件名称</param>
' '' <param name="target">事件所在静态类</param>
' '' <param name="methodName">方法名称</param>
' '' <param name="instance">方法所在实例</param>
' '' <remarks></remarks>
Public Shared Sub RemoveEventHandler( ByVal eventName As String , ByVal target As Type, ByVal methodName As String , ByVal instance As Object )
Dim mBinding As Reflection.BindingFlags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.NonPublic Or BindingFlags.Static
Dim mEventInfo As Reflection.EventInfo = target.GetEvent(eventName, mBinding)
Dim mMethodInfo As Reflection.MethodInfo = instance.GetType.GetMethod(methodName, mBinding)
Dim d As [ Delegate ]
If mMethodInfo.IsStatic Then
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, Nothing , mMethodInfo)
Else
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, instance, mMethodInfo)
End If
mEventInfo.RemoveEventHandler(target, d)
End Sub
' '' <summary>
' '' 移除事件绑定
' '' </summary>
' '' <param name="eventName">事件名称</param>
' '' <param name="target">事件所在静态类</param>
' '' <param name="methodName">方法名称</param>
' '' <param name="instance">方法所在静态类</param>
' '' <remarks></remarks>
Public Shared Sub RemoveEventHandler( ByVal eventName As String , ByVal target As Type, ByVal methodName As String , ByVal instance As Type)
Dim mBinding As Reflection.BindingFlags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.NonPublic Or BindingFlags.Static
Dim mEventInfo As Reflection.EventInfo = target.GetEvent(eventName, mBinding)
Dim mMethodInfo As Reflection.MethodInfo = instance.GetMethod(methodName, mBinding)
Dim d As [ Delegate ]
d = [ Delegate ].CreateDelegate(mEventInfo.EventHandlerType, Nothing , mMethodInfo)
mEventInfo.RemoveEventHandler(target, d)
End Sub
End Class
End Namespace
效果
Demo下载