/// <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}()."));
        }
Esempio n. 2
0
 public void Invoke(string eventName, object[] args, Server.ReplyCallback reply)
 {
     if (eventName != "test")
     {
         throw new NotImplementedException();
     }
     reply(null, "Hello, world!");
 }
Esempio n. 3
0
 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");
     }
 }