public IReceivedMessage <object> CreateReceivedMessage(Guid senderId, CourierMessageV1 message, IPAddress remoteAddress)
        {
            var payload                = pofSerializer.Deserialize(new MemoryStream(message.Payload));
            var payloadType            = payload.GetType();
            var receivedMessageFactory = receivedMessageFactoriesByPayloadType.GetOrAdd(
                payloadType,
                add => GetType().GetMethod(nameof(CreateReceivedMessageHelper), BindingFlags.NonPublic | BindingFlags.Instance).MakeGenericMethod(payloadType)
                );

            return((IReceivedMessage <object>)receivedMessageFactory.Invoke(this, new[] { senderId, message, payload, remoteAddress }));
        }
        private void HandleInboundMessage(Guid senderId, CourierMessageV1 message, IPEndPoint remoteEndPoint)
        {
            if (!localEndpoint.Matches(message.RecipientId))
            {
                return;
            }
            if (message.MessageFlags.HasFlag(MessageFlags.AcknowledgementRequired))
            {
                messageAcknowledger.SendAcknowledge(senderId, message.Id);
            }
            var receivedMessage = receivedMessageFactory.CreateReceivedMessage(senderId, message, remoteEndPoint.Address);
            var payloadType     = receivedMessage.Payload.GetType();

            messageRouter.RouteMessage(payloadType, receivedMessage);
        }
 private IReceivedMessage <object> CreateReceivedMessageHelper <TPayload>(Guid senderId, CourierMessageV1 message, TPayload payload, IPAddress remoteAddress)
 {
     return((IReceivedMessage <object>) new ReceivedMessage <TPayload>(
                message.Id,
                senderId,
                message.RecipientId,
                message.MessageFlags,
                payload,
                remoteAddress
                ));
 }