internal override Expression Marshal(Expression parameter) { return(_innerBuilder.Marshal(Helpers.Convert(parameter, _parameterType))); }
// this helper prepares arguments for COM binding by transforming ByVal StongBox arguments // into ByRef expressions that represent the argument's Value fields. internal static bool[] ProcessArgumentsForCom(ComMethodDesc method, ref DynamicMetaObject[] args, List <ParameterExpression> temps, List <Expression> initTemps) { Debug.Assert(args != null); DynamicMetaObject[] newArgs = new DynamicMetaObject[args.Length]; bool[] isByRefArg = new bool[args.Length]; for (int i = 0; i < args.Length; i++) { DynamicMetaObject curArgument = args[i]; // set new arg infos to their original values or set default ones // we will do this fixup early so that we can assume we always have // arginfos in COM binder. if (IsByRef(curArgument)) { newArgs[i] = curArgument; isByRefArg[i] = true; } else { if (IsPSReferenceArg(curArgument)) { var restrictions = curArgument.Restrictions.Merge( GetTypeRestrictionForDynamicMetaObject(curArgument) ); // we have restricted this argument to LimitType so we can convert and conversion will be trivial cast. Expression boxedValueAccessor = Expression.Property( Helpers.Convert( curArgument.Expression, curArgument.LimitType ), curArgument.LimitType.GetProperty("Value") ); PSReference value = curArgument.Value as PSReference; object boxedValue = value != null ? value.Value : null; newArgs[i] = new DynamicMetaObject( boxedValueAccessor, restrictions, boxedValue ); isByRefArg[i] = true; } else { if ((method.ParameterInformation != null) && (i < method.ParameterInformation.Length)) { newArgs[i] = new DynamicMetaObject(curArgument.CastOrConvertMethodArgument( method.ParameterInformation[i].parameterType, i.ToString(CultureInfo.InvariantCulture), method.Name, temps, initTemps), curArgument.Restrictions); } else { newArgs[i] = curArgument; } isByRefArg[i] = false; } } } args = newArgs; return(isByRefArg); }
internal override Expression Marshal(Expression parameter) { return(Helpers.Convert(parameter, typeof(IConvertible))); }
internal override Expression Marshal(Expression parameter) { Debug.Assert(parameter != null); return(Helpers.Convert(parameter, ParameterType)); }