以编程方式调用抽象类中存储在字典中的方法?

时间:2018-08-13 17:28:48

标签: c# .net

让我们说我有一个这样的字典,它包含所有数据包事件。

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);
}

不仅可以改善代码,还可以简化使用,强制类始终遵循正确的界面,并使字典更易于使用。

1 个答案:

答案 0 :(得分:0)

我不明白这个问题,但这听起来像是您要寻找的东西:

Events = new Dictionary<short, IAsyncPacket>()
... (code to load dictionary) ...

...
if (Events.TryGetValue(packetId, out IAsyncPacket p))
{
    await p.Handle(session, packet, coreContext);
}
...