예제 #1
0
        public bool Handle(ActionListenerContext context)
        {
            var comparer = new TypeIsOfBaseComparer();

            IEnumerable <MethodDescriptor> filtered = GetDescriptors()
                                                      .Where(x => x.Name == context.CallInfo.MethodName &&
                                                             x.ParameterTypes.SequenceEqual(context.CallInfo.UnnamedArguments.ToTypes(), comparer))
                                                      .ToList();

            var returnType = context.CallInfo.ReturnType;

            if (returnType != null)
            {
                var funcDescriptor = filtered.OfType <FuncDescriptor>().Where(f => f.ReturnType == returnType).FirstOrDefault();
                if (funcDescriptor == null)
                {
                    throw new MissingMethodException("Method not found");
                }
                var instance = GetInstanceFromMethodDescriptor(funcDescriptor);
                context.Result = funcDescriptor.Func(instance, context.CallInfo.UnnamedArguments.ToArray());
            }
            else
            {
                var actionDescriptor = filtered.OfType <ActionDescriptor>().FirstOrDefault();
                if (actionDescriptor == null)
                {
                    throw new MissingMethodException("Method not found");
                }
                var instance = GetInstanceFromMethodDescriptor(actionDescriptor);
                actionDescriptor.Action(instance, context.CallInfo.UnnamedArguments.ToArray());
            }
            return(true);
        }
예제 #2
0
        public object ExecuteListeners(ActionCallInfo callInfo)
        {
            object[] actionListeners = _resolvingService.ResolveAll(typeof(IActionListener));
            IEnumerable <IActionListener> handlers = actionListeners.Cast <IActionListener>().Where(h => h.CanHandle(callInfo));
            var  context    = new ActionListenerContext(callInfo);
            bool wasHandled = handlers.Any(actionListener => actionListener.Handle(context));

            if (!wasHandled)
            {
                throw new InvalidOperationException("No handler for call");
            }
            return(context.Result);
        }
        public bool Handle(ActionListenerContext context)
        {
            var unnamed = context.CallInfo.UnnamedArguments;

            for (int i = 0; i < unnamed.Count; i++)
            {
                var val = unnamed[i] as string;
                if (val != null)
                {
                    unnamed[i] = val.Trim();
                }
            }
            return(false);
        }
예제 #4
0
        public bool Handle(ActionListenerContext context)
        {
            var arg = context.CallInfo.NamedArguments.FirstOrDefault(x => x.Item1.Equals("log", StringComparison.OrdinalIgnoreCase));

            if (arg == null || !(arg.Item2 is bool) || !(bool)arg.Item2)
            {
                return(false);
            }
            var unnamed = context.CallInfo.UnnamedArguments;

            Console.Write("Calling {0}({1}) with Args: ", context.CallInfo.MethodName, context.CallInfo.ReturnType);
            for (int i = 0; i < unnamed.Count; i++)
            {
                var val = unnamed[i];
                Console.Write("input{0}: {1} ", i, val);
            }
            Console.WriteLine();
            return(false);
        }