2016-05-29 14 views
1

Also versuche ich im Grunde, ein dynamisches Menürahmenwerk in C# zu erstellen. Ich habe im Wesentlichen ein Menüelement (nur ein Rechteck mit etwas Text an dieser Stelle), das eine DoAction() -Methode enthält. Diese Methode wird immer dann ausgeführt, wenn auf das Rechteck geklickt wird. Ich möchte, dass die DoAction-Methode zur Laufzeit definiert werden kann. So könnte ich beispielsweise ein Menüelement instantiieren, dessen DoAction() - Methode die Funktion x() ausführt, und dann ein anderes Menüelement instanziieren, dessen DoAction() -Methode die Funktion y() ausführt. Was ich habe, ist so etwas.Klasse mit dynamischen Methoden erstellen

public class MenuElement { 
    public void DoAction(); // method I want to be dynamic 

    public MenuElement((text, height, width, etc), method myMethod){ 
     DoAction = myMethod; 
    } 
} 

MenuElement m1 = new MenuElement(..., function x()); 
MenuElement m2 = new MenuElement(..., function y()); 

m1.DoAction(); // calls x() 
m2.DoAction(); // calls y() 

Dies ist die Art von Dingen, die ich weiß, wie in Javascript zu tun, aber ich bin nicht so mit C# vertraut, und ich vermute, .Net wird mich durch ein paar Reifen als JS würde springen. Nach dem, was ich lese, werde ich Delegierte verwenden müssen? Ich kann keine Tutorials finden, denen ich wirklich folgen kann.

Antwort

2

Verwenden Sie die Aktionsklasse. In Ihrem Beispiel wäre es:

public class MenuElement { 
public Action DoAction; // method I want to be dynamic 

public MenuElement((text, height, width, etc), Action myMethod){ 
    DoAction = myMethod; 
} 
} 

MenuElement m1 = new MenuElement(..., new Action(() => { 
// your code here 
}); 

MenuElement m2 = new MenuElement(..., new Action(() => { 
// your code here 
)); 

m1.DoAction(); // calls x() 
m2.DoAction(); // calls y() 

Weitere Informationen MSDN

+0

Ehrfürchtig, das ist genau das, was ich gesucht habe! Muss ich jedes Mal einen Lambda-Ausdruck verwenden? Oder könnte ich eine bereits existierende Methode weitergeben? Sprich, etwas wie neue Aktion (myAlreadyExistingMethod()); –

+0

Nach einem kurzen Test: ja du kannst. Für jeden, der sich fragt, ist es so einfach wie neu Aktion (myAlreadyExistingMethod); // keine Klammern nach dem Methodennamen –

+0

Danke für die angenommene Antwort. Ich hoffe, ich könnte helfen :) –

1

sehen Ja, Delegierte der Weg zu gehen sind. Sie können verschiedene Geschmacksrichtungen der Delegierten Action und Func für Ihre Anforderung verwenden. Wollen Sie das erreichen?

public class MenuElement 
{ 
    public MenuElement(string text, int height, int width, Action<object> myMethod) 
    { 
     DoAction = myMethod; 
    } 

    public Action<object> DoAction { get; private set; } 
} 

     MenuElement m1 = new MenuElement("text", 10, 20, (obj) => { Console.WriteLine("MenuElement1"); }); 
     m1.DoAction(null); 


     Action<object> y = (obj) => 
     { 
      Console.WriteLine("MenuElement2"); 
     }; 

     MenuElement m2 = new MenuElement("text", 10, 20, y); 
     m2.DoAction(null); // calls y() 
+0

Sie sind ein Gentleman und ein Gelehrter, Sir. Das ist eine großartige Antwort. Es gibt zusätzliche syntaktische Güte. Der einzige Grund, warum ich Jordan die Zecke gegeben habe, war, dass ich seine Syntax mehr mochte (DoAction (null) scheint ein wenig umständlich). –

+1

Wie ich in meiner Antwort erwähnt habe, gibt es verschiedene Varianten von Action und Func, die basierend auf den Eingabeparametern und der Ausgabe verwendet werden können, die Sie von Ihrer DoAction zurückgeben möchten. Wenn es keinen Eingabeparameter gibt, verwenden Sie eine einfache Aktion. Froh, dass ich helfen konnte. –

Verwandte Themen