我有多个状态类,每个类都实现一个IState
接口,定义了可以在每个接口上调用的方法种类:
public interface IState
{
Type BanknoteInserted(Banknote banknoteInfo);
Type SwitchToggled(bool switchEnabled);
Type CardDataReceived(string track1Data, string track2Data, string track3Data);
}
我有一个CurrentState
属性,该属性更改为指向已加载的当前IState
实现。
单独(由硬件或用户交互驱动),我有需要在CurrentState
上执行这些方法的事件。为了简化线程和其他原因,这些事件在后台线程中按顺序排队和处理。
如何在队列中引用特定的接口方法,以便我可以"应用"当该队列项出列时,当前任何类的方法设置为CurrentState
?
队列中的每个方法调用都应该能够接收有意义的类型化方法参数(在项目入队时设置)。
我能够工作的唯一选择是回退反射并将(string methodName, object[] methodParameters)
的元组插入队列,但这是最好的选择吗?感觉我应该能够使用代表。
答案 0 :(得分:3)
您可以创建一个包含IState
的每个方法的回调的类:
public class Callbacks
{
public static readonly Func<IState, Banknote, Type> OnBanknoteInserted =
(s, b) => s.BanknoteInserted(b);
// and so on, for each method
public Func<IState, Banknote, Type> BanknoteInserted { get; set; }
// and so on, for each method
}
然后在入队:
// put method that should be invoked on dequeue
queue.Enqueue(new Callbacks { BanknoteInserted = Callbacks.OnBanknoteInserted});
然后出发你可能会这样:
Callbacks callback = queue.Dequeue();
if (callback.BanknoteInserted != null)
return callback.BanknoteInserted(CurrentState, banknote);
// else if (callback.SwitchToggled != null)
// and so on...
编辑:要保存Enqueue
上的参数,请考虑以下方法:
定义界面
public interface IStateMethod
{
Type FireEvent(IState currentState);
}
为IState
中的每个方法创建实现,如下所示:
public class BanknoteInsertedMethod : IStateMethod
{
private readonly Banknote banknote;
// save all parameters here
public BanknoteInsertedMethod(Banknote banknote)
{
this.banknote = banknote;
}
public Type FireEvent(IState currentState)
{
return currentState.BanknoteInserted(this.banknote);
}
}
现在你可以Eqnueue
var queue = new Queue<IStateMethod>();
queue.Enqueue(new BanknoteInsertedMethod(banknote));
然后在Dequeue
上,只需致电FireEvent
:
IStateMethod stateMethod = queue.Dequeue();
return stateMethod.FireEvent(currentState);