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); }
static BoxedConverter() { MethodInfo method = FindCastOperator(typeof(T)) ?? FindCastOperator(typeof(F)); _castMethod = (method == null) ? null : (CastMethod)Delegate.CreateDelegate(typeof(CastMethod), method); }
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); }