Typ einer Methode per String überprüfen (MethodInfo/GetMethod)

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von p4trick.

    Typ einer Methode per String überprüfen (MethodInfo/GetMethod)

    Hey,
    ich bin neu hier und habe keine Ahnung ob das der richtige Bereich ist.

    Zu meiner Frage:

    Ich suche eine Möglichkeit um zu überprüfen, ob eine bestimmte Methode in meinem Programm existiert.
    Dazu verwende ich aber einen String.

    IDEAL wäre folgendes: Ich habe eine Funktion, die mein gesamtes Programm nach der Methode "MethodenName" durchsucht.
    Wenn sie existiert, wird true zurückgegeben.
    Aber es wäre auch okay, wenn nur die aktuelle Klasse durchsucht wird.

    Folgenden Code habe ich bisher:

    VB.NET-Quellcode

    1. Dim m As MethodInfo = Me.GetType().GetMethod("MethodName")


    Das funktioniert auch relativ gut.
    Allerdings nur, wenn die Methode NICHT private ist.

    Beispielcode 1:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Function ExistiertMethode(ByVal Methodenname As String) As Boolean
    3. Try
    4. Dim m As MethodInfo = Me.GetType().GetMethod("MethodName")
    5. If m.ToString.Contains("void") Then Return True
    6. Catch ex As Exception
    7. Return False
    8. End Try
    9. End Function
    10. Private Sub MethodName()
    11. 'was auch immer...
    12. End Sub
    13. End Class

    Dieses Beispiel würde FALSE zurückgeben, weil die Methode private ist.

    Beispielcode 2:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Function ExistiertMethode(ByVal Methodenname As String) As Boolean
    3. Try
    4. Dim m As MethodInfo = Me.GetType().GetMethod("MethodName")
    5. If m.ToString.Contains("void") Then Return True
    6. Catch ex As Exception
    7. Return False
    8. End Try
    9. End Function
    10. Sub MethodName()
    11. 'was auch immer...
    12. End Sub
    13. End Class

    Hier würde alles funktionieren und TRUE zurückgegeben werden.

    Danke im voraus an alle, die versuchen mir zu helfen :thumbsup:

    LG
    - Patrick
    Ich finde es zu unsauber und hab es lieber, wenn die Methoden, die private sein sollen, auch private sind.
    Außerdem soll es immer funktionieren. Egal welche Art von Methode gewählt wurde ;)

    Das Ganze ist für ein Sicherheitssystem.
    das sind glaub ziemlich abwegige Experimente.

    Programmier lieber so, dass du weißt, welche Methoden in deinem Programm vorhanden sind.

    Reflection soll auch zimelich imperformant sein.

    Abermal im Ernst: Wozu soll das gut sein?

    Evtl. gibts mit Interfaces oder Events bessere Möglichkeiten.


    ...wenn die Methoden, die private sein sollen, auch private sind.
    Dassis richtig. Dann soll man diese privaten Methoden aber auch nicht mit Reflection hacken.
    Hi
    zum Beispiel so:

    VB.NET-Quellcode

    1. Public Sub FindMethods(ByVal methodName As String, ByVal assembly As Reflection.Assembly, ByVal publicOnly As Boolean, ByVal handler As Action(Of Reflection.MethodInfo))
    2. Dim bf As Reflection.BindingFlags = Reflection.BindingFlags.Static Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public
    3. If Not publicOnly Then
    4. bf = bf Or Reflection.BindingFlags.NonPublic
    5. End If
    6. For Each tp As Type In assembly.GetTypes() 'Alle Types und nested Types durchgehen
    7. If tp.IsPublic OrElse Not publicOnly Then 'filtern, hier koennte auch noch nach static gefiltert werden
    8. 'Alle Member mit dem spezifizierten Namen finden
    9. For Each mi As Reflection.MemberInfo In tp.GetMember(methodName, bf)
    10. 'ueberprufen, ob der Member eine Methode ist (und von Reflection.MethodInfo erbt)
    11. If TypeOf mi Is Reflection.MethodInfo Then
    12. 'handler aufrufen oder so
    13. handler.Invoke(DirectCast(mi, Reflection.MethodInfo))
    14. End If
    15. Next
    16. End If
    17. Next
    18. End Sub


    Beispielaufruf:

    VB.NET-Quellcode

    1. Dim sb As New System.Text.StringBuilder(1024)
    2. FindMethods("Test", Reflection.Assembly.GetExecutingAssembly(), False, Sub(method As Reflection.MethodInfo)
    3. sb.AppendLine(String.Concat(method.DeclaringType.FullName, Type.Delimiter, method.Name))
    4. End Sub)
    5. MessageBox.Show(sb.ToString())


    Bei den BindingFlags kannst du wie geschrieben auch noch mal nach Static oder Instance einschränken. Du könntest die BindingFlags natürlich auch gleich als Parameter übergeben.

    Da die vorherigen Posts da noch nicht gemacht wurden, empfehle ich aber dennoch dringend, das nicht so zu machen. Was soll dein Sicherheitssystem schützen?

    Gruß
    ~blaze~
    @ErfinderDesRades:Es wird eine Art Tamper Protection. Damit kann ich überprüfen, ob das Programm manipuliert wurde.
    Ich möchte aber auch nicht zu viel verraten...
    Security through obscurity

    Dazu, dass Reflection inperformant sei:
    Ich rufe die Methoden über Reflection nicht auf. Ich verwende nur ein geschützes Try, Catch um herauszufinden, ob die Methode existiert.

    @~blaze~:
    Herzlichen Dank! Damit werde ich erstmal herumspielen :)

    EDIT: Der Code ist genial! Es werden alle Arten von Subs erkannt (private, public, shared...), aufgelistet und sogar gesagt, wo sie sich genau befinden.
    Das ist genau, was ich gebraucht habe.
    Nocheinmal: VIELEN DANK :thumbsup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „p4trick“ ()