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;
        }
Ejemplo n.º 2
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);
        }