保持对接口方法的引用并将其应用于该接口的实现

时间:2017-07-19 15:33:12

标签: c# interface reference delegates

我有多个状态类,每个类都实现一个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)的元组插入队列,但这是最好的选择吗?感觉我应该能够使用代表。

1 个答案:

答案 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);