private static IArgChecker CreateFromMethodCallExpression(MethodCallExpression expression)
        {
            if (expression.Method.IsGenericMethod && expression.Method.DeclaringType == ArgClassType)
            {
                var expressionGenericMethodDefinition = expression.Method.GetGenericMethodDefinition();

                if (expressionGenericMethodDefinition == ArgAnyMethodInfo)
                {
                    return(new AnyArgChecker());
                }

                if (expressionGenericMethodDefinition == ArgMatchMethodInfo)
                {
                    var genericParameters        = expression.Method.GetGenericArguments();
                    var typedMatchArgCheckerType = GenericMatchArgCheckerType.MakeGenericType(genericParameters);

                    var constructorArgument  = ((UnaryExpression)expression.Arguments[0]).Operand;
                    var constructorArguments = new object[] { constructorArgument };
                    var matchArgChecker      = (IArgChecker)Activator.CreateInstance(
                        typedMatchArgCheckerType,
                        constructorArguments);

                    return(matchArgChecker);
                }
            }

            throw CaishenException.InvalidArgumentExpression();
        }
 public CastleCoreProxyFactory()
 {
     if (!typeof(TInterface).IsInterface)
     {
         throw CaishenException.ProxyFactoryNonInterface();
     }
 }
        public TInterface CreateProxy(TInterface underlyingObject, params IInterceptor[] interceptors)
        {
            if (underlyingObject == null)
            {
                throw CaishenException.UnderlyingObjectIsNull();
            }

            var castleInterceptors = interceptors
                                     .Select(interceptor => new CastleInterceptor(interceptor) as Castle.DynamicProxy.IInterceptor)
                                     .ToArray();
            var proxyObject = _proxyGenerator.CreateInterfaceProxyWithTargetInterface(underlyingObject, castleInterceptors);

            return(proxyObject);
        }
        public IArgChecker CreateArgChecker(Expression expression)
        {
            switch (expression)
            {
            case ConstantExpression constantExpression:
                return(CreateFromConstantExpression(constantExpression));

            case MethodCallExpression methodCallExpression:
                return(CreateFromMethodCallExpression(methodCallExpression));

            default:
                throw CaishenException.InvalidArgumentExpression();
            }
        }