1

ユーザーがカスタム コマンドを作成し、必要に応じて実行するプログラムを作成しています。その結果、次のようなクラスがあります。

public class Command
{
    Action c { get; set; }

    // Overloaded Constructors------------------------------------

      // changes the volume                
      public Command(int volumeChange)
      {
        c = ()=>
            SomeClass.ChangeMasterVolume(volumeChange);
      }

      // Animate something
      public Command(int x, int y)
      {
        c = ()=>
            SomeClass.MoveMouse(x,y);
      }

      // etc.. there are more contructors....

   //---------------------------------------------------------


    public void ExecuteCommand()
    {
        c();
    }
}

ユーザーがアプリケーションを閉じたら、それらのコマンドをディスクのどこかに保存したいと思います。約 200 の異なるコマンドがあり、そのクラスからインスタンスをシリアル化できれば便利です。Action が含まれているため、シリアル化することはできません。

実行するコマンドを決定するために巨大な switch ステートメントを作成する必要がなければ、それは素晴らしいことです。これに対処する最善の方法は何ですか?

4

2 に答える 2

2

デリゲートの代わりにインターフェイスを維持する必要があるように思えます。

 public interface IDoThingy
 {
      void DoStuff();
 }

 public class IncreaseVolumeThingy : IDoThingy
 {
     public int Volume { get; set; }

     public IncreaseVolumeThingy(int volume)
     {
         Volume = volume;
     }

     public void DoStuff()
     {
         SomeClass.ChangeMasterVolume(Volume);
     }
 }

 public class Command
 {
      protected IDoThingy _thingy = null;

      public Command(IDoThingy thingy)
      {
           _thingy = thingy;
      }

      public void ExecuteCommand()
      {
          _thingy.DoStuff();
      }
 }

したがって、一連のコンストラクターを作成する代わりに、指定されたコマンドに基づいて何らかの形式のファクトリーを作成するだけです。ユーザーが音量を上げるコマンドを設定している場合は、 のインスタンスを新規作成しIncreaseVolumeThingyて保存します。シリアル化すると、デリゲートなしの状態から再作成できます。

于 2012-05-18T17:34:02.237 に答える
0

リフレクションを使用して、クラス メソッドをその名前で呼び出します。クラスとメソッド名をシリアル化します。

http://www.codeproject.com/Articles/19911/Dynamically-Invoke-A-Method-Given-Strings-with-Met

于 2012-05-18T17:31:57.857 に答える