2017-05-10 11 views
0

私はある種の「マクロマネージャ」を持ったプログラムを持っており、マクロを保存して再生することができます。マクロは、ユーザーが単独で選択できる関数です。例えばC#関数を動的に追加する

ユーザーは、彼は次の手順を実行しようとしている新しいマクロを作成したい場合:

  1. クリックボタン
  2. 「機能を選択し、」
  3. クリックボタンを「作成」、別のボタンをクリックします(ボタンは、その背後に機能を保持している)
  4. あなたが見ることができるように、ユーザーのことができるようにすべきであるマクロ

を再生動的に使用する機能を選択します。

私は、デリゲートを使用してみましたが、私は本当に(私はそれについて読んだことがあるにもかかわらず)、それらを理解しない

だからこれは私のコードです:

マクロを保持し、それらを次々と果たしているMacroManager(他):

namespace ControlCenter 
{ 
    public class ControlCenterMacroManager 
    { 
     public List<ControlCenterMacro> macroList = new List<ControlCenterMacro>(); 
     public string macroName; 

     public void runMacroList() 
     { 
      Thread t = new Thread(new ThreadStart(runMacroList_t)); 
      t.Start(); 
     } 

     public void runMacroList_t() 
     { 
      foreach (ControlCenterMacro macro in macroList) 
      { 
       Console.Write("Playing Macro: "); 
       macro.Run(); 
      } 
     } 

    } 
} 

これはマクロのようになります。

namespace ControlCenter 
{ 
    public class ControlCenterMacro 
    { 
     public bool isTimeout=false; 
     public int timemilli=0; 
     public delegate int macroAction(); 
     public macroAction action; 

     public void Run() 
     { 
      if (isTimeout) 
      { 
       Console.Write("Waiting " + timemilli + " milliseconds "); 
       Thread.Sleep(timemilli/4); 
       Console.Write("."); 
       Thread.Sleep(timemilli/4); 
       Console.Write("."); 
       Thread.Sleep(timemilli/4); 
       Console.Write("."); 
       Thread.Sleep(timemilli/4); 
       Console.WriteLine(" done"); 
      } 
      else 
      { 
       Console.WriteLine("Playing action " + action.ToString()); 
       action(); 
      } 
     } 
    } 
} 

そして、これは(別のプロジェクトに別のクラスに位置しています)私はその背後に横たわっていたいの可能な機能の一つである:

public int turnOn() 
{ 
    Console.WriteLine("Einschalten:"); 
    if(HomeMaticHttpRequest.sendRequest(this.url + "statechange.cgi?ise_id=" + this.RecieverId + "&new_value=true")!=null) 
     return 0; 
    return 1; 
} 

誰もが私はあまりハードコーディングせずにこの問題を解決することができる方法を知っていますか? (それを比較的ダイナミックに保ちたい)

+0

マクロはあらかじめ定義された関数ですか?ユーザーはマクロのパラメータを設定する必要がありますか? –

+0

可能な機能の制限はありますか?彼らは戻り値を持っていますか?またはいくつかのvoid型ですか?彼らはパラメータを持っていますか? –

+0

純粋なC#をスクリプトに使用することもできます。CodeDomを使用してオンザフライコードを生成し、アセンブリでコンパイルし、必要なだけ何度でも再利用できるように格納することができます。 – Gusman

答えて

0

ここでは、その本質を解説した小さな例です。

マクロ:

public class Macro 
{ 
    public delegate int macroAction(); 
    public macroAction action; 

    public void Run() 
    { 
     action(); 
    }  
} 

異なるメソッドを持つコンテナクラス:より一般的なバージョンについて

void Main() 
{  
    Container c = new Container(); 

    List<Macro> MacroList = new List<Macro>(); 

    for (int i = 0; i < 10; i++) 
    { 
     Macro m = new Macro(); 
     if (i % 2 == 0) 
     { 
      m.action = c.turnOn; 
     } 
     else 
     { 
      m.action = c.turnOff; 
     } 

     MacroList.Add(m); 
    } 

    foreach (var m in MacroList) 
    { 
     m.Run(); 
    }  
} 

:異なる方法を割り当て

public class Container 
{ 
    public int turnOn() 
    { 
     Console.WriteLine("Einschalten"); 
     return 1; 
    } 

    public int turnOff() 
    { 
     Console.WriteLine("Ausschalten"); 
     return 1; 
    } 
} 

および小テストのprogramm私は明日帰る必要があります、私の電車に乗ることを得た;)

関連する問題