/// <summary>
 /// Unsubscribes the specified receiver from messages of the specified type
 /// </summary>
 /// <param name="type"></param>
 /// <param name="receiver"></param>
 public void Unsubscribe(GameCoordinatorMessageType type, GameCoordinatorReceiver receiver)
 {
     if (!_dispatchers.ContainsKey(type))
     {
         _dispatchers[type] -= receiver;
     }
 }
 public virtual bool TryResolve(MethodInfo method, object gc, out GameCoordinatorReceiver receiver)
 {
     receiver = null;
     if (method.ReturnType == typeof(Task))
     {
         return(ResolveTask(method, gc, out receiver));
     }
     else
     {
         return(false);
     }
 }
        protected virtual bool ResolveTask(MethodInfo method, object gc, out GameCoordinatorReceiver receiver)
        {
            receiver = null;

            var parameters = method.GetParameters();

            if (parameters.Length != 1)
            {
                return(false);
            }

            var param = parameters.Single().ParameterType;

            if (param == typeof(GameCoordinatorMessage))
            {
                receiver = method.CreateDelegate(typeof(GameCoordinatorReceiver), gc) as GameCoordinatorReceiver;
                return(true);
            }
            else if (param == typeof(Header))
            {
                var inbetween = method.CreateDelegate(typeof(Func <Header, Task>), gc) as Func <Header, Task>;
                receiver = (message) => inbetween(message.Header);
                return(true);
            }
            else if (param == typeof(GameCoordinatorProtobufHeader))
            {
                var inbetween = method.CreateDelegate(typeof(Func <GameCoordinatorProtobufHeader, Task>), gc) as Func <GameCoordinatorProtobufHeader, Task>;
                receiver = (message) => inbetween(message.Header as GameCoordinatorProtobufHeader);
                return(true);
            }
            else
            {
                var invoke = InvokeGCBodyAsyncInfo
                             .MakeGenericMethod(param)
                             .CreateDelegate(typeof(Func <GameCoordinatorMessage, Delegate, Task>)) as Func <GameCoordinatorMessage, Delegate, Task>;
                Delegate d = method.CreateDelegate(typeof(Func <,>).MakeGenericType(param, typeof(Task)), gc);
                receiver = (message) => invoke(message, d);
                return(true);
            }
        }