public void ServerEventRespondsToOptions(bool registerOn) { var streams = FullDuplexStream.CreateStreams(); var rpc = new JsonRpc(streams.Item1, streams.Item1); var options = new JsonRpcTargetOptions { NotifyClientOfEvents = registerOn }; var server = new Server(); rpc.AddLocalRpcTarget(server, options); if (registerOn) { Assert.NotNull(server.ServerEventAccessor); Assert.NotNull(server.ServerEventWithCustomArgsAccessor); } else { Assert.Null(server.ServerEventAccessor); Assert.Null(server.ServerEventWithCustomArgsAccessor); } }
internal EventReceiver(JsonRpc jsonRpc, object server, EventInfo eventInfo, JsonRpcTargetOptions options) { Requires.NotNull(jsonRpc, nameof(jsonRpc)); Requires.NotNull(server, nameof(server)); Requires.NotNull(eventInfo, nameof(eventInfo)); options = options ?? JsonRpcTargetOptions.Default; this.jsonRpc = jsonRpc; this.server = server; this.eventInfo = eventInfo; this.rpcEventName = options.EventNameTransform is not null?options.EventNameTransform(eventInfo.Name) : eventInfo.Name; try { // This might throw if our EventHandler-modeled method doesn't "fit" the event delegate signature. // It will work for EventHandler and EventHandler<T>, at least. // If we want to support more, we'll likely have to use lightweight code-gen to generate a method // with the right signature. ParameterInfo[] eventHandlerParameters = eventInfo.EventHandlerType !.GetTypeInfo().GetMethod("Invoke") !.GetParameters(); if (eventHandlerParameters.Length != 2) { throw new NotSupportedException($"Unsupported event handler type for: \"{eventInfo.Name}\". Expected 2 parameters but had {eventHandlerParameters.Length}."); } Type argsType = eventHandlerParameters[1].ParameterType; if (typeof(EventArgs).GetTypeInfo().IsAssignableFrom(argsType)) { this.registeredHandler = OnEventRaisedMethodInfo.CreateDelegate(eventInfo.EventHandlerType !, this); } else { MethodInfo closedGenericMethod = OnEventRaisedGenericMethodInfo.MakeGenericMethod(argsType); this.registeredHandler = closedGenericMethod.CreateDelegate(eventInfo.EventHandlerType !, this); } } catch (ArgumentException ex) { throw new NotSupportedException("Unsupported event handler type for: " + eventInfo.Name, ex); } eventInfo.AddEventHandler(server, this.registeredHandler); }