Example #1
0
        private static DynamicExpression MakeDynamic(CallSiteBinder binder, Type returnType, ReadOnlyCollection <Expression> args)
        {
            ContractUtils.RequiresNotNull(binder, "binder");

            for (int i = 0; i < args.Count; i++)
            {
                Expression arg = args[i];

                ValidateDynamicArgument(arg);
            }

            Type delegateType = DelegateHelpers.MakeCallSiteDelegate(args, returnType);

            // Since we made a delegate with argument types that exactly match,
            // we can skip delegate and argument validation

            switch (args.Count)
            {
            case 1: return(DynamicExpression.Make(returnType, delegateType, binder, args[0]));

            case 2: return(DynamicExpression.Make(returnType, delegateType, binder, args[0], args[1]));

            case 3: return(DynamicExpression.Make(returnType, delegateType, binder, args[0], args[1], args[2]));

            case 4: return(DynamicExpression.Make(returnType, delegateType, binder, args[0], args[1], args[2], args[3]));

            default: return(DynamicExpression.Make(returnType, delegateType, binder, args));
            }
        }
 public static Expression MakeDynamic(Type type, CallSiteBinder binder, IEnumerable <Expression> arguments, Type[] argumentTypes)
 {
     if (argumentTypes == null)
     {
         return(Expression.Dynamic(binder, type, arguments));
     }
     else
     {
         // NB: This is a trick to leverage MakeCallSiteDelegate; we should refactor it to take in an array of types.
         var args         = argumentTypes.Map(a => (Expression)Expression.Default(a)).ToReadOnly();
         var delegateType = DelegateHelpers.MakeCallSiteDelegate(args, type);
         return(Expression.MakeDynamic(delegateType, binder, arguments));
     }
 }