什么是这样的:
public interface IPacket
{
}
public class FooPacket: IPacket {}
public class PacketService
{
private static readonly ConcurrentDictionary<Type, Action<IPacket>> _Handlers = new ConcurrentDictionary<Type, Action<IPacket>>(new Dictionary<Type, Action<IPacket>>());
public static void RegisterPacket<T>(Action<T> handler)
where T: IPacket
{
_Handlers[typeof (T)] = packet => handler((T) packet);
}
private void ProcessReceivedPacket(IPacket packet)
{
Action<IPacket> handler;
if (!_Handlers.TryGetValue(packet.GetType(), out handler))
{
// Error handling here. No packet handler exists for this type of packet.
return;
}
handler(packet);
}
}
class Program
{
private static PacketService _PacketService = new PacketService();
static void Main(string[] args)
{
PacketService.RegisterPacket<FooPacket>(HandleFooPacket);
}
public static void HandleFooPacket(FooPacket packet)
{
// Do something with the packet
}
}
每次创建注册它可以处理特定于该类型的数据包封装类型。使用ConcurrentDictionary会使锁定变得多余。
那么,我的头稍微有些......我可以看到你正在创建所有不同数据包的映射,并且大概我正在客户端重构我的数据包对象 - 并将它提供给处理器。通过调用processRecievedPacket呢?那么,外部监听器触发的方式到底是什么?听着吗? –
那么,你正在通过网络连接接收二进制数据。在某些时候,您将它们重建为.NET对象。您现在可以将此数据包交给PacketService ProcessReceivedPacket方法,该方法选择数据包的最终处理程序。这不是你想要的吗? –
这就是我的意图 - 我只是对我的听众如何'听到'这个事件被触发感到困惑。我仍然是这个主题的新手,我习惯于订阅一个活动......并且没有任何活动可以在这里订阅。 –