2016-05-29 5 views
1

私は基本的にC言語で動的メニューフレームワークを作成しようとしています。私は本質的に、DoAction()メソッドを含むメニュー要素(この時点ではテキストを含む長方形)を持っています。このメソッドは、矩形がクリックされるたびに実行されます。私が望むのは、実行時にDoActionメソッドを定義できることです。たとえばDoAction()メソッドがx()関数を実行したメニュー要素をインスタンス化し、次にDoAction()メソッドがy()関数を実行する別のメニュー要素をインスタンス化することができます。私が持っているものは、このようなものです。動的メソッドを使ってクラスを作成する

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() 

これは、私はJavaScriptで行う方法を知っているもののようなものですが、私は、C#のように慣れていないんだ、と私は.NETは私はJSが希望よりもさらにいくつかのフープを介してジャンプになります疑い。私が読んでいることから、私はデリゲートを使わなければならないでしょうか?私は本当に簡単に従うことができるチュートリアルは見つかりません。

答えて

2

アクションクラスを使用します。あなたの例では、次のようになります。

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() 

詳細についてはMSDN

+0

これはまさに私が探していたものです!毎回ラムダ式を使用する必要がありますか?あるいは、私は既に存在する方法で渡すことができるでしょうか?たとえば、新しいAction(myAlreadyExistingMethod())のようなものです。 –

+0

クイックテストの後:はいできます。新しいAction(myAlreadyExistingMethod)のような単純なものが不思議に思える人のために。 //メソッド名の後に角括弧が付きません –

+0

答えに感謝します。私は私が助けることができることを願っています。 –

1

を参照してくださいはい、代表者が移動するための方法です。代理人ActionFuncの異なるフレーバーを使用することができます。これはあなたが達成しようとしていることですか?

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

あなたは紳士と学者です。これは素晴らしい答えです。これは、構文上の優れた点を提供します。ジョーダンにティックを与えたのは、彼の構文がもっと好きだったからです(DoAction(null)はちょっと面倒です)。 –

+1

私の答えで言及したように、DoActionから返す入力パラメータと出力に基づいて使用できるActionとFuncのさまざまな味があります。入力パラメータがない場合、単純なアクションを使用します。私が助けることができてうれしい。 –

関連する問題