将操作或功能保存在辅助内存上
本文关键字:内存 存在 保存 操作 功能 | 更新日期: 2023-09-27 18:34:41
我正在创建一个程序,用户可以在其中创建自定义命令并在需要时执行它们。 结果我有一个类似于以下内容的类:
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 个不同的命令,如果我能从该类序列化一个实例,那就太好了。由于它包含一个操作,因此无法对其进行序列化。
如果我不必创建一个巨大的switch语句来确定要执行的命令,那就太好了。处理这个问题的最佳方法是什么?
在我看来,您只需要保留一个界面而不是委托。
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
实例并将其存储。序列化时,可以在没有委托的情况下从状态重新创建它。
使用反射按名称调用类方法。序列化类和方法名称。
http://www.codeproject.com/Articles/19911/Dynamically-Invoke-A-Method-Given-Strings-with-Met