让我们说我有一个这样的字典,它包含所有数据包事件。
Events = new Dictionary<short, Func<ISession, IIncomingPacket, ICoreContext, Task>>
{
{IncomingPacketIds.HandshakeRequest, HandshakeRequest.Handle }
};
每个数据包文件都遵循界面,因此完全相同。
public abstract class HandshakeRequest : IAsyncPacket
{
public async Task Handle(ISession session, IIncomingPacket packet, ICoreContext coreContext)
{
// TODO
}
}
IAsyncPacket
接口所做的所有事情都是强制使用Handle方法。
public interface IAsyncPacket
{
Task Handle(ISession session, IIncomingPacket packet, ICoreContext coreContext);
}
所以我的主要问题是,在第一本字典中。有没有一种方法可以只传入该类,并以编程方式调用Handle方法,因为在总是相同的情况下键入它似乎是多余的。
这是我当前如何执行该词典的值:
if (Events.TryGetValue(packetId, out var packetEvent))
{
await packetEvent.Invoke(session, packet, _coreContext);
}
不仅可以改善代码,还可以简化使用,强制类始终遵循正确的界面,并使字典更易于使用。
答案 0 :(得分:0)
我不明白这个问题,但这听起来像是您要寻找的东西:
Events = new Dictionary<short, IAsyncPacket>()
... (code to load dictionary) ...
...
if (Events.TryGetValue(packetId, out IAsyncPacket p))
{
await p.Handle(session, packet, coreContext);
}
...