Laden...

Delegate als Parameter übergeben

Erstellt von er4zox vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.861 Views
E
er4zox Themenstarter:in
2 Beiträge seit 2015
vor 8 Jahren
Delegate als Parameter übergeben

Hallo Leute,

folgendes Problem:

Ich habe 3 Klassen (vereinfacht dargestellt),


//MenueHandler.cs
class MenueHandler {
        
        List<Menue> _menu;

        public void process() {
          _menu[_menu.count].process();
        }

        //Neues Menü
        public void CreateNewMenue() {

        }
        //Löse aktuelles Menü auf
        public void LeaveMenue() {

        }


// Menue.cs
class Menue {
        
        List<MenueItem> _MenueItem;

        public void process() {
          //Schleife
          _MenueItem[i].Aktion();
        }



// MenueItem.cs
class MenueItem {
        
        public MenueItem(delegate del){
        }

        public void Aktion(){
          del();
        }

Der MenueHandler erzeugt ein neues Menue Objekt. Das Menue Objekt erzeugt mehrere MenueItems. Ich möchte dem Konstruktor des MenueItems gerne die Funktionen CreateNewMenue() oder LeaveMenue() vom MenueHandler übergeben, sodass diese abonniert und sobald die Funktion Aktion() aufgerufen wird, ausgeführt werden.

Wie könnte ich das realisieren?

Mfg
Er4zox

16.842 Beiträge seit 2008
vor 8 Jahren

Func ist das Stichwort
Pass Method as Parameter using C#



public int Method1(string input)
    {
        //... do something
        return 0;
    }

    public bool RunTheMethod(Func<string, int> myMethodName)
    {
        //... do stuff
        int i = myMethodName("My String");
        //... do more stuff
        return true;
    }

    public bool Test()
    {
        return RunTheMethod(Method1);
    }

Besser wäre übrigens ein Event ( [Artikel] Drei-Schichten-Architektur ).
Du solltest keine Business-Logik direkt in GUI-Elementen ausführen; die sollen sich nicht mal kennen.

1.029 Beiträge seit 2010
vor 8 Jahren

--- nicht richtig gelesen ---

502 Beiträge seit 2004
vor 8 Jahren

Mal abgesehen davon, dass

_menu[_menu.count].process();

mit Sicherheit eine IndexOutOfRangeException werfen wird, hat Abt schon das richtige Stichwort gegeben, nämlich Func<T> (bzw. eine der Varianten mit ggf. mehr T's) - allerdings denke ich in Deinem Fall wäre es eher die Action-Klasse, da Du void zurückgibst...

Bart Simpson

Praxis ist wenn alles funktioniert und keiner weiss warum.
Theorie ist wenn man alles weiss, aber nichts funktioniert.

Bei uns wird Theorie und Praxis vereint: Nichts funktioniert und keiner weiss warum...

E
er4zox Themenstarter:in
2 Beiträge seit 2015
vor 8 Jahren

Mal abgesehen davon, dass

_menu[_menu.count].process();  

mit Sicherheit eine IndexOutOfRangeException werfen wird, ...

Da hast du recht, da habe ich das "-1" noch vergessen, der Code sollte ja nur als Beispiel dienen.

Vielen Dank Leute für eure schnellen Antworten.
Ich habe es jetzt mittels Action hinbekommen 😃

MfG
er4zox

Hinweis von Coffeebean vor 8 Jahren

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 2.3