internal static DynamicMetaObject/*!*/ AddDynamicTestAndDefer(DynamicMetaObjectBinder/*!*/ operation, DynamicMetaObject/*!*/ res, DynamicMetaObject/*!*/[] args, ValidationInfo typeTest, Type deferType, params ParameterExpression[] temps) { if (typeTest != null && typeTest.Test != null) { // add the test and a validtor if present Expression defer = operation.GetUpdateExpression(deferType ?? typeof(object)); Type bestType = BindingHelpers.GetCompatibleType(defer.Type, res.Expression.Type); res = new DynamicMetaObject( Expression.Condition( typeTest.Test, Utils.Convert(res.Expression, bestType), Utils.Convert(defer, bestType) ), res.Restrictions ); } if (temps.Length > 0) { // finally add the scoped variables res = new DynamicMetaObject( Expression.Block(temps, res.Expression), res.Restrictions, null ); } return res; }
internal static DynamicMetaObject AddDynamicTestAndDefer(DynamicMetaObjectBinder operation, DynamicMetaObject res, DynamicMetaObject[] args, ValidationInfo typeTest, params ParameterExpression[] temps) { return AddDynamicTestAndDefer(operation, res, args, typeTest, null, temps); }