Díky za reakci, chápu záměr, ale v originálním znění nezrealizuji, neboť mé (staré) VS2005 tvrdošíjně nezná Tuple, Lookup, bohužel. Ve snaze vyhnut se té vlastní třídě s přiřazenými události jsem našel jsem malou inspiraci u stejného zdroje : http://stackoverflow.com/questions/42081... Nejdříve se mi některé události nedařilo najít, nakonec se mi vrací (systémem pokus omyl) vše, co bylo žádáno viz. link, ačkoli potřebuji najít jen všechny události přidané pomocí AddHandler, mám všechny controly a jejich události přidány dynamicky za běhu, ale je-li event přidán v návrhu naleznu ho také. Např. ve formuláři deklaruji : Dim WithEvents pb as PictureBox Událost Click přidám v návrhu: Private Sub pb_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles hb.Click
'
End Sub Událost Paint přidám pomocí AddHandler: AddHandler pb.Paint, AddressOf pb_Paint Událost Paint: Private Sub pb_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs)
'
End Sub Hledání událostí: Public Sub GetListeners(ByVal myObject As Object)
Dim targetType As Type = myObject.[GetType]()
Do
Dim myFieldList As System.Reflection.FieldInfo() = _
targetType.GetFields(System.Reflection.BindingFlags.Static Or System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic)
For Each myInfo As System.Reflection.FieldInfo In myFieldList
Dim myDelegate As [Delegate] = TryCast(myInfo.GetValue(myObject), [Delegate])
If myDelegate IsNot Nothing Then
For Each myItem As [Delegate] In myDelegate.GetInvocationList
If myDelegate.GetInvocationList(0).Method.DeclaringType.FullName = Me.GetType.ToString Then
System.Diagnostics.Debug.WriteLine(myDelegate.GetInvocationList(0).Method.Name & "-->" & myDelegate.GetInvocationList(0).Method.DeclaringType.FullName)
End If
Next
End If
Try
Dim eventList As System.ComponentModel.EventHandlerList = DirectCast(myObject.GetType().GetProperty("Events", _
(System.Reflection.BindingFlags.FlattenHierarchy Or (System.Reflection.BindingFlags.NonPublic Or _
System.Reflection.BindingFlags.Instance))).GetValue(myObject, Nothing), System.ComponentModel.EventHandlerList)
myDelegate = eventList(myInfo.GetValue(myObject))
Catch ex As Exception
End Try
If myDelegate IsNot Nothing Then
For Each myItem As [Delegate] In myDelegate.GetInvocationList
If myDelegate.GetInvocationList(0).Method.DeclaringType.FullName = Me.GetType.ToString Then
System.Diagnostics.Debug.WriteLine(myDelegate.GetInvocationList(0).Method.Name & "-->" & myDelegate.GetInvocationList(0).Method.DeclaringType.FullName)
End If
Next
End If
Next
targetType = targetType.BaseType
Loop While targetType IsNot Nothing
End Sub Případně jak rozlišit, je-li událost z návrhu nebo pomocí AddHandler? V mém případě jsou všechny controly a jejich události přidány za běhu pomocí AddHandler (tak mě to tolik netrápí) avšak před jejich odebráním se chystám tyto nalezené události controlům odebrat a nevím jak dál. Co použít pro odstranění nalezeného handleru? Jak vytvořit event a delegáta z jejich názvu pro RemoveHandler? [Delegate].Remove? GetRemoveMethod? EventInfo.RemoveEventHandler? Díky za případnou další pomoc.
|