private Dictionary <Type, MessageHandlerBinding> BuildHandlerMap() { var dictionary = new Dictionary <Type, MessageHandlerBinding>(); foreach (Type messageType in _messageTypes) { foreach (Type handlerType in _handlerTypes) { var methodInfoFiltered = handlerType.GetMethods().Where(mi => mi.IsPublic && mi.GetParameters().Any(p => messageType == p.ParameterType)); MethodInfo target = methodInfoFiltered.FirstOrDefault(); if (target != null) { ConstructorInfo info = handlerType.GetConstructors().FirstOrDefault(); MessageHandler messageHandler = (MessageHandler)info.Invoke(new object[] { this }); MessageHandlerBinding binding = new MessageHandlerBinding { objectTarget = messageHandler, methodTarget = target }; dictionary.Add(messageType, binding); } } } return(dictionary); }
protected override void OnMessage(MessageEventArgs e) { try { Message message = DeserializeMessage(e.Data); MessageHandlerBinding binding = _handlerMap[message.GetType()]; MessageHandler handler = binding.objectTarget; MethodInfo method = binding.methodTarget; Player player = this.GetCurrentSessionPlayer(); string pname = (player != null) ? player.Name : "unknown"; bool verbose = (message.MessageType != MessageTypeNames.HostStateChange && message.MessageType != MessageTypeNames.GuestInputChange && message.MessageType != MessageTypeNames.GuestCommandChange && message.MessageType != MessageTypeNames.HostCommandChange && message.MessageType != MessageTypeNames.MiceChange); if (verbose) { LogMessage($"OnMessage {message.MessageType} from {pname}"); } Message responseMessage = (Message)method.Invoke(handler, new object[] { message }); if (responseMessage != null) { Respond(responseMessage); } //if(verbose) //{ // LogMessage($"OnMessage {message.MessageType} from {pname}"); //} } catch (Exception exception) { string msg = (exception.InnerException == null) ? exception.Message : exception.InnerException.Message; LogMessage($"{msg}"); ServerErrorMessage error = new ServerErrorMessage() { Error = msg }; Send(JsonConvert.SerializeObject(error)); } }