Hallo Community
Nachdem schon einige Male die Frage gestellt wurde wie man eine Methode über den Funktionsnamen aufrufen kann, habe ich beschlossen hier zwei Vorschläge zu bringen.
Ganz bestimmt gibt es mehrere optimierte Möglichkeiten dazu, wie man sowas lösen kann. Ich hab mich hier für die DesignPattern Strategy einerseits und für die Invoke anderseits entschieden. Dazu muss ich erwähnen, dass ich ganz bewusst alles sehr einfach gehalten und alles komplett auseinandergerissen habe, um die einzelnen Schritte verständlicher Darstellen zu können.
Beim ersten Vorschlag wird man merken, dass die Funktionen/Methoden zu Klassen umgewandelt worden sind. Dies ist nötig, damit das Designpattern überhaupt umgesetzt werden kann.
Beim zweiten Vorschlag sind die Funktionen/Methoden ganz normal in einer Klasse.
Am besten einfach mal durch alles durchsteppen.
Anregungen, Kritik und Verbesserungsvorschläge immer gerne willkommen.
Freundliche Grüsse
exc-jdbi
Nachdem schon einige Male die Frage gestellt wurde wie man eine Methode über den Funktionsnamen aufrufen kann, habe ich beschlossen hier zwei Vorschläge zu bringen.
Ganz bestimmt gibt es mehrere optimierte Möglichkeiten dazu, wie man sowas lösen kann. Ich hab mich hier für die DesignPattern Strategy einerseits und für die Invoke anderseits entschieden. Dazu muss ich erwähnen, dass ich ganz bewusst alles sehr einfach gehalten und alles komplett auseinandergerissen habe, um die einzelnen Schritte verständlicher Darstellen zu können.
Beim ersten Vorschlag wird man merken, dass die Funktionen/Methoden zu Klassen umgewandelt worden sind. Dies ist nötig, damit das Designpattern überhaupt umgesetzt werden kann.
Beim zweiten Vorschlag sind die Funktionen/Methoden ganz normal in einer Klasse.
Am besten einfach mal durch alles durchsteppen.
VB.NET-Quellcode
- Option Strict On
- Option Explicit On
- Imports FuncName
- Public Module modFuncName
- Private dicFunction As Dictionary(Of String, context) = Nothing
- Public Sub Main()
- testFunc()
- Console.ReadKey()
- End Sub
- Private Sub testFunc()
- Dim t As New Tools
- dicFunction = t.getAllDllFunc()
- If (dicFunction IsNot Nothing) AndAlso (dicFunction.Count > 0) Then
- For Each s As String In dicFunction.Keys
- Dim cont As context = Nothing
- If dicFunction.TryGetValue(s, cont) Then
- cont.executeFunc()
- End If
- Next
- End If
- End Sub
- End Module
VB.NET-Quellcode
- Option Strict On
- Option Explicit On
- Imports FuncName
- Imports System.Reflection
- Public Module modFuncName
- Private dicFunction As Dictionary(Of String, MethodInfo) = Nothing
- Public Sub Main()
- testFunc()
- Console.ReadKey()
- End Sub
- Private Sub testFunc()
- Dim t As New Tools
- Dim dt As New DllFunc
- dicFunction = t.getAllDllFunc()
- If (dicFunction IsNot Nothing) AndAlso (dicFunction.Count > 0) Then
- Dim mi As MethodInfo = Nothing
- For Each s As String In dicFunction.Keys
- If dicFunction.TryGetValue(s, mi) Then
- mi.Invoke(dt, Nothing)
- End If
- Next
- End If
- End Sub
- End Module
VB.NET-Quellcode
- Private Sub testFunc2()
- Dim t As New Tools
- Dim dt As New DllFunc, dt2 As New DllFunc2 ' gewünsche Assembly-Klassen zuerst instanzieren
- Dim tp() As Type = {dt.GetType, dt2.GetType} 'gewünschte Assembly-Klassen einbinden in Type-Array
- dicFunction = t.getAllDllFunc(tp)
- If (dicFunction IsNot Nothing) AndAlso (dicFunction.Count > 0) Then
- Dim res As Object = Nothing 'Zeigt die unterschiedlichen Return
- Dim pm() As Object = {3, 5} 'Für die parametrisierten Methoden
- Dim mi As MethodInfo = Nothing 'Type für alle gewünschten Funktionen/Methoden
- For Each s As String In dicFunction.Keys
- If dicFunction.TryGetValue(s, mi) Then
- If mi.ReflectedType = tp(0) Then 'Alle Funktionen der DllFunc
- mi.Invoke(dt, Nothing)
- ElseIf mi.ReflectedType = tp(1) Then 'Alle Funktionen der DllFunc2
- If (mi.Name = "func4") OrElse (mi.Name = "func7") Then 'Für die parameterlosen Funktionen
- res = mi.Invoke(dt2, Nothing)
- Else : res = mi.Invoke(dt2, pm)
- End If
- End If
- End If
- Next
- End If
- End Sub
Anregungen, Kritik und Verbesserungsvorschläge immer gerne willkommen.
Freundliche Grüsse
exc-jdbi
Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von „exc-jdbi“ ()