Announcement

Collapse
No announcement yet.

gibts sowas: Führe_aus("Sub/Function-Name")

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • gibts sowas: Führe_aus("Sub/Function-Name")

    Ok,

    in dem kurzen Titel ist mir einfach keine bessere Umschreibung eingefallen für das, was ich suche ;o)

    Ich würde gerne wissen, ob es möglich ist zur Laufzeit des Programms den Namen einer Sub/Function, die aufgerufen werden soll in einem String zusammenzubauen und diese dann auszuführen.

    Gesuchter_Befehl("NameDerSubDieIchStartenWill")

    Mich würde interessieren, ob sowas möglich ist, ich kann auch mit einem 'nein' leben ;o)

  • #2
    Hallo Dirk,

    ja, es gibt solche Möglichkeiten.

    Du kannst mit Reflection aus dem Namen einer Methode über GetMethods usw. einen Verweis auf eine Methode bekommen und diese dann ausführen.

    Du kannst mit Delegates arbeiten und je nach dem gegebenen Namen eine andere Methode zuordnen.

    Du kannst über eine Fallunterscheidung nach dem Namen mal die eine, mal eine andere Methode ausführen lassen.

    Wenn ich mich richtig erinnere, habe ich auch schon von Skript-Lösungen mit .NET gelesen. Unter Umständen weiß codeproject mehr dazu.

    Ich habe aber große Zweifel, ob sich solche Maßnahmen wirklich lohnen. Vielleicht beschreibst du genauer, in welcher Situation du auf diesen Gedanken gekommen bist, damit wir direktere/einfachere Lösungen vorschlagen können.

    Gruß Jürgen

    Comment


    • #3
      Im Falle öffentlicher Methoden reicht CallByName(), ansonsten muß man Reflection bemühen, wie im nachfolgenden Demo gezeigt.

      [highlight=vbnet]Public Class Form1

      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      'klappt, da MyPublicSub eine öffentliche Methode ist
      CallByName(Me, "MyPublicSub", CallType.Method, "Title", "This is my message")
      Try
      'schlägt fehl, da MyPrivateSub eine private Methode ist
      CallByName(Me, "MyPrivateSub", CallType.Method, "Title", "This is my message")
      Catch ex As Exception
      'Reflection nach privater Methode suchen lassen
      Dim mi As System.Reflection.MethodInfo = GetType(Form1).GetMethod("MyPrivateSub", Reflection.BindingFlags.IgnoreCase Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic, Nothing, New Type() {GetType(String), GetType(String)}, Nothing)
      'und ausführen
      If mi IsNot Nothing Then mi.Invoke(Me, New Object() {ex.Message, "Private Methods: Use reflection"})
      End Try
      End Sub

      Public Sub MyPublicSub(ByVal title As String, ByVal message As String)
      MsgBox(message, Title:=title)
      End Sub

      Private Sub MyPrivateSub(ByVal title As String, ByVal message As String)
      MsgBox(message, Title:=title)
      End Sub
      End Class[/highlight]

      Comment

      Working...
      X