Funktion durch Ihren Namen als String aufrufen

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von MarioGeier01.

    Oder CallByName
    msdn.microsoft.com/en-us/library/22x2chfx.aspx

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. CallByName(Me, "Malfunction", Microsoft.VisualBasic.CallType.Method, Nothing)
    3. End Sub
    4. Public Sub Malfunction()
    5. MessageBox.Show("Just kidding")
    6. End Sub


    Wobei das AFAIK nicht mit Privates geht.
    And i think to myself... what a wonderfuL World!
    @MarioGeier01 Willkommen im Forum. :thumbup:
    Wenn Du uns sagst, wozu Du das brauchst, könnten wir Dir besser helfen.
    Was in jedem Falle funktioniert, ggf. aber noch zu kompliziert für Dich ist folgendes Szenario:
    Steuerung eines Programms über externe Makros, im Makro steht der Name der Klasse / Prozedur.
    Über Reflection wird eine Instanz der Klasse by Name erzeugt und über Reflection wird da eine Prozedur by Name aufgerufen.
    Nun ist allerdings das Reflection-Zeugs nix, was man hier in wenigen Worten erklären könnte, da benötigst Du schon etwas vertiefte Kenntnisse in .NET-Programmierung.
    Hast Du die?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Interessante Aufgabenstellung

    ErfinderDesRades schrieb:

    Welche überzeugenden Gründe


    Also mir würden schon Gründe einfallen, aber ich sehe das genau so. ClassByName ist ausserdem auch veraltetes VB6-Werkzeug.

    Wenn also nicht über ClassByName, wie dann? Würde mich Interessieren wie man das sauber hinkriegt.
    Ein Interface vielleicht? Oder einer der Designpratter-Konstrukte?

    Freundliche Grüsse

    exc-jdbi
    Hallo ihr Flinken :D,

    ich bin sehr überrascht über die vielen Antworten. DANKE :)

    Ich möchte diese Möglichkeit, mit einer Zeichenfolge eine Methode aufzurufen in zwei Hinsichten einsetzen:

    1. in einem Programm, dass Eingaben aufnimmt (Mausbewegung, Tastatur), und diese abspeichert. Nun soll mein Programm diese nachmachen, und dazu wäre es eben recht einfach, zeilenweise die Datei mit den gespeicherten Eingaben durchzugehen und dann nur die dahintersteckende Funktion auszuführen, aber ohne eine Select Case Struktur. Is halt nur die Frage ob's geht.

    Bsp der Speicherdatei:
    MouseMoveTo 50;80
    MouseClick RigthClick
    Wait 5395
    KeyBoard G

    2. Client-Server Anwendung: bräuchte ich wieder keine endlose Select Case Struktur, die die Funktion zu einem empfangenen String erst raussuchen muss.

    Vor allem bei Punkt zwei ist es grauenhaft, einen String für eine auszuführende Funktion zu senden, und dann ihn wieder "zurückzuübersetzen" und die Funktion auszuführen
    -> Fehlerquelle.

    Also formuliere ich meine Frage nochmal:
    Für Punkt 1: Wie könnte man mit dem jeweiligen String, der eine Funktion beschreibt, diese direkt ausführen.
    Für Punkt 2: Gibt es schöne Lösungen, übers Internet für eine Funktion z. B. ein Handle(?) zu schicken? Wenn nicht, wie in Punkt 1. Geht damit dann auch auf die Form zuzugreifen (ShowDialog(), FormBorderStyle, usw...) oder z. B. MsgBox?

    Ich habe schon bisschen Erfahrung in VB und im Programmieren. Macht Spaß :D


    Liebe Grüße,

    Mario
    ah - ok.
    Könnte man zusammenfassen als Remote-Befehle, also dass Text übertragen/gelesen wird, und beim Empfänger Methoden aufrufen soll.
    Oder anders gesagt: Das BefehlsProtokoll-Problem.

    In klassischer Programmierung könnte man den Select Case auch durch ein Dictionary ersetzen, was String auf Action-Delegaten mappt.

    Aber tatsächlich hat die Dictionary-Lösung im Grunde dasselbe Risiko wie ein CallbyName: Nämlich wenn ein Befehl übertragen wird, dens nicht gibt, dan Peng.

    Also warum nicht gleich ein CallByName implementieren?
    Geht einigermassen (umständlich) mit Reflection, aber man kann ja Wrapper-Klassen schreiben, die die Umständlichkeiten wegkapseln.
    Guggemol hier, da habich sowas gemacht, was per CallByName auf Felder und Properties zugreift (mit Methoden ginge es fast ebenso): Basic Benchmarks
    Und ist sogar ziemlich kandidelt, mit vorkompilierten Linq-Lambdas, dass auch echt flott zugreift.
    Was bei Remoting ja garnet soo wichtig wäre, aber vlt. nice-to-have, und kostet ja nix.