Example #1
0
        public static object ConvertToEnumerableObject(IEnumerable seq, Symbol type)
        {
            var t    = (Type)GetType(type);
            var m2   = CastMethod.MakeGenericMethod(t);
            var seq2 = m2.Invoke(null, new object[] { ToIter(seq) });

            return(seq2);
        }
Example #2
0
            static BoxedConverter()
            {
                MethodInfo method = FindCastOperator(typeof(T)) ?? FindCastOperator(typeof(F));

                _castMethod = (method == null) ? null : (CastMethod)Delegate.CreateDelegate(typeof(CastMethod), method);
            }
Example #3
0
        public static Expression ConvertArgument(object arg, Type parameterType)
        {
            Type       type;
            Expression argExpr;

            if (arg is DynamicMetaObject)
            {
                var dmo = (DynamicMetaObject)arg;
                type    = dmo.LimitType;
                argExpr = dmo.Expression;
                if (typeof(IApply).IsAssignableFrom(type) && IsSpecificDelegate(parameterType))
                {
                    argExpr = GetDelegateExpression(argExpr, parameterType);
                }
                else if (CanMaybeConvertToEnumType(parameterType, type))
                {
                    argExpr = Expression.Call(null, ConvertToEnumTypeMethod, Expression.Constant(parameterType, typeof(Type)), Expression.Convert(argExpr, typeof(object)));
                }
                else if (CanMaybeCastToEnumerableT(parameterType, type))
                {
                    // e.g. convert (1 2 3) to List<Int32>.
                    var ts = parameterType.GetGenericArguments();
                    var m  = CastMethod.MakeGenericMethod(ts);
                    argExpr = Expression.Call(null, m, Expression.Convert(argExpr, typeof(IEnumerable)));
                }
                else if (type != parameterType && typeof(IConvertible).IsAssignableFrom(type) && typeof(IConvertible).IsAssignableFrom(parameterType))
                {
                    //argExpr = Expression.Convert( argExpr, typeof( object ) );
                    argExpr = Expression.Call(ChangeTypeMethod, argExpr, Expression.Constant(parameterType));
                    argExpr = Expression.Convert(argExpr, parameterType);
                }
                else
                {
                    argExpr = Expression.Convert(argExpr, parameterType);
                }
            }
            else
            {
                type = arg == null ? typeof(object) : arg.GetType();
                if (typeof(IApply).IsAssignableFrom(type) && IsSpecificDelegate(parameterType))
                {
                    argExpr = GetDelegateExpression(Expression.Constant(arg), parameterType);
                }
                else if (CanMaybeConvertToEnumType(parameterType, type))
                {
                    argExpr = Expression.Call(null, ConvertToEnumTypeMethod, Expression.Constant(parameterType, typeof(Type)), Expression.Constant(arg, typeof(object)));
                }
                else if (CanMaybeCastToEnumerableT(parameterType, type))
                {
                    var ts = parameterType.GetGenericArguments();
                    var m  = CastMethod.MakeGenericMethod(ts);
                    argExpr = Expression.Call(null, m, Expression.Constant(arg, type));
                }
                else if (type != parameterType && typeof(IConvertible).IsAssignableFrom(type) && typeof(IConvertible).IsAssignableFrom(parameterType))
                {
                    argExpr = Expression.Constant(arg, typeof(object));
                    argExpr = Expression.Call(ChangeTypeMethod, argExpr, Expression.Constant(parameterType));
                    argExpr = Expression.Convert(argExpr, parameterType);
                }
                else
                {
                    argExpr = Expression.Convert(Expression.Constant(arg, type), parameterType);
                }
            }

            return(argExpr);
        }