/// <inheritdoc /> public void Invoke(string eventName, object[] args, Server.ReplyCallback reply) { if (Methods.TryGetValue(eventName, out MethodData data)) { if (args.Length < data.NeededParameterCount || args.Length > data.parameters.Length) { string argsString = data.NeededParameterCount == data.parameters.Length ? data.NeededParameterCount.ToString() : $"{data.NeededParameterCount} to {data.parameters.Length}"; reply(new ErrorInformation("TypeError", $"{eventName}() can take only {argsString} arguments")); return; } for (int i = 0; i < args.Length; i++) { Type t1 = args[i].GetType(); Type t2 = data.parameters[i].ParameterType; if (!t2.IsAssignableFrom(t1)) { reply(new ErrorInformation("NameError", $"Argument #{i} is of type {t1.FullName} but should be {t2.FullName}")); return; } } var passArgs = args; if (args.Length < data.parameters.Length) { passArgs = new object[data.parameters.Length]; for (int i = 0; i < passArgs.Length; i++) { passArgs[i] = i < args.Length ? args[i] : data.parameters[i].DefaultValue; } } object instance = data.method.IsStatic ? null : (object)ServiceImplementor; try { object result = data.method.Invoke(instance, passArgs); if (data.method.ReturnType == typeof(void)) { result = true; // Return true to specify that the side-effect was completed nicely } reply(null, result); return; } catch (TargetInvocationException te) { reply(new ErrorInformation(te.InnerException.GetType().FullName, te.InnerException.Message, te.InnerException.StackTrace)); } catch (Exception e) { reply(new ErrorInformation("RemoteError", e.Message, e.StackTrace)); } } reply(new ErrorInformation("NameError", $"The service does not provide {eventName}().")); }
public void Invoke(string eventName, object[] args, Server.ReplyCallback reply) { if (eventName != "test") { throw new NotImplementedException(); } reply(null, "Hello, world!"); }
public static void Invoke(Server server, string eventName, object[] args, Server.ReplyCallback reply) { if (methods.TryGetValue(eventName, out var action)) { action(server, args, reply); } else { throw new NotImplementedException($"Core event {eventName} is not supported"); } }