Void als Variable in einer Liste

  • C#

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Darkshadow9.

    Void als Variable in einer Liste

    Hallo Programmierer,

    ich arbeite momentan an einer kleinen Klassenbibliothek, wobei ich im Programm, welches die .dll nutzt, Methoden übergeben will. Parallel dazu werden noch Befehle, ebenfalls in eine separate Liste, abgelegt. Wenn einer dieser Befehle in StreamReader.ReadLine() auftaucht, soll die dazugehörige vom Programm übergebene void aufgerufen werden. Allerdings habe ich nach ewigem Suchen und Ausprobieren nichts gefunden, was ohne Fehlermeldungen die IDE durchgehen lässt :whistling:

    Kennt da jemand eine Lösung?

    LG Darkshadow9
    Den Text verstehe ich nicht aber der Titel sagt aus, dass du eine Variable vom Typ void machen möchtest. Dies aber schlichtweg unmöglich. Void steht quasi für nichts und somit kannst du auch keine Variable von dessen Typ erstellen. Das einzige wo void in Verbindung mit einer Variable vorkommt(was aber etwas total anderes ist), ist bei Pointern. Hier kann ein void-Pointer erstellt werden(void*). Dies ist quasi ein generischer Pointer, ähnlich wie die System.Object-Klasse welche als Basis für alle anderen Objekte dient.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Das geht schon, schau dir mal "Action" an:

    VB.NET-Quellcode

    1. dim arbeiter as New Action(AddressOf arbeiterSub))


    Wenn pro Zeile nur genau ein bekannter Befehl stehen würde könntest du ein Dictionary(of String, Action) verwenden und mittels dictionary(line).Invoke die entsprechende Methode aufrufen. Bei dir wäre sowas möglich:

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private befehle As New List(Of Befehl)
    4. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    5. befehle.Add(New Befehl("beep", New Action(AddressOf worker_Beep)))
    6. befehle.Add(New Befehl("msg", New Action(AddressOf worker_msg)))
    7. End Sub
    8. Private Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
    9. Dim input = {"asdf msg asdds", " adsf beep", "beep", "dd msgssdf"}
    10. For Each ib In input
    11. For Each b In befehle
    12. If ib.Contains(b.Bezeichnung) Then
    13. b.doSomething()
    14. Console.WriteLine(b.Bezeichnung)
    15. End If
    16. Next
    17. Next
    18. End Sub
    19. Private Sub worker_Beep()
    20. Console.Beep(500, 500)
    21. End Sub
    22. Private Sub worker_msg()
    23. MsgBox("eine MSG Box")
    24. End Sub
    25. End Class
    26. Public Class Befehl
    27. Public Sub New(ByVal Bezeichnung As String, ByVal worker As Action)
    28. Me.Bezeichnung = Bezeichnung
    29. Me.worker = worker
    30. End Sub
    31. Private worker As Action = Nothing
    32. Public Property Bezeichnung As String
    33. Public Sub doSomething()
    34. worker.Invoke()
    35. End Sub
    36. End Class


    Das Problem: Wenn du sehr viele dieser "Befehle" verwendest solltest du dir ein besseres System überlegen. Alleine der Code in Form1_Load ist dann nichtmehr hinnehmbar. Du könntest die Befehl-Klasse abstrakt (=> mustinherhit) machen und weiter ausbauen. Anschließend müsstest du für jeden Befehl eine eigene Klasse schreiben. Diese könnten dann mit einem Pluginsystem geladen werden - der Code aus Form1_Load fällst dann weg und du könntest auch nachträglich Befehle hinzufügen ohne den restlichen Code anfassen zu müssen^^

    Edit: Action gibt es btw auch mit Parametern die du übergeben kannst, z.B. Action(of String, Integer, Double) entspräche eines Sub(v1 as String, v2 as Integer, v3 as Double). Auch Rückgabewerte werden unterstützt, da musst du statt Action aber Func benutzen.
    Hallo, mir gehts grundsätzlich wie thefileo, das ich nicht wirklich dein Vorhaben verstehe. Ich nehme mal an, das du je nach anweisung, die in der Zeile steht eine bestiummte void-Methode ausführen willst. Du könntest beispielsweise einen switch-Block nehmen und entsprechend methoden aufrufen:

    Quellcode

    1. switch(line)
    2. {
    3. case "exit":
    4. exit();
    5. break;
    6. case "run":
    7. run();
    8. break;
    9. }

    Um nun Parameter abzufangen, musst du beispielsweise an einem Trennzeichen splitten und dann nur den Befehl selber verarbeiten:

    Quellcode

    1. string line = "shutdown /s /f / t 3000"
    2. string command = line.Split(' ')[0];

    An die Parameter kannst du dann heran kommen, indem du mittels Substring oder Remove etc. die Länge des Commands entfernst und dann die Parameter einzeln durch gehst.
    Danke für die schnellen Antworten!

    @thefiloe: Ja, ich gebe zu, dass der Text etwas unglücklich ausgedrückt ist :D

    @FreakJNS: Das sieht nach genau dem aus, wonach ich gesucht habe, vielen Dank! Werde es gleich ausprobieren :)

    @Koopakiller: Werde mir das mal ansehen, danke!

    Edit: FreakJNS's Lösungsansatz und ein bisschen Zeit haben das Problem gelöst, danke!

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