2012-05-18 55 views
1

我正在創建一個程序,用戶創建自定義命令並在需要時執行它們。結果我有一個類似於:在輔助存儲器上保存動作或funcs

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,所以不可能序列化它。

這將是很好,如果我不必創建一個巨大的開關語句,以確定要執行的命令。處理這個問題的最好方法是什麼?

回答

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的實例並將其存儲。當它被序列化時,它可以在沒有委託的情況下從狀態重新創建。

相關問題