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
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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...
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
Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 2.3