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