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 回答