public override DynamicMetaObject FallbackInvokeMember(DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion) { try { return new DynamicMetaObject( (Static.GetTargetType(target.Value) .Null(t => YacqExpression.TypeCandidate(this._symbols, t)) ?? target.Expression.Reduce(this._symbols).TryConvert(target.RuntimeType) ) .Method(this._symbols, this.Name, args.SelectAll(o => o.Expression.Reduce(this._symbols).TryConvert(o.RuntimeType)) ) .Reduce(this._symbols) .If(e => e.Type == typeof(void), e => Expression.Block(e, Expression.Default(typeof(Object))) ) .If(e => e.Type.IsValueType, e => e.TryConvert(typeof(Object)) ), target.Restrictions ); } catch (Exception ex) { return errorSuggestion ?? new DynamicMetaObject( Expression.Throw(Expression.Constant(ex), typeof(Object)), BindingRestrictions.Empty ); } }
public override DynamicMetaObject FallbackSetIndex(DynamicMetaObject target, DynamicMetaObject[] indexes, DynamicMetaObject value, DynamicMetaObject errorSuggestion) { try { return new DynamicMetaObject( YacqExpression.Function(this._symbols, "=", YacqExpression.Function(this._symbols, ".", target.Expression.Reduce(this._symbols).TryConvert(target.RuntimeType), YacqExpression.Vector(this._symbols, indexes.SelectAll(o => o.Expression.Reduce(this._symbols).TryConvert(target.RuntimeType)) ) ), value.Expression.Reduce(this._symbols).TryConvert(target.RuntimeType) ).Reduce(this._symbols).TryConvert(typeof(Object)), target.Restrictions ); } catch (Exception ex) { return errorSuggestion ?? new DynamicMetaObject( Expression.Throw(Expression.Constant(ex), typeof(Object)), BindingRestrictions.Empty ); } }
public override DynamicMetaObject FallbackInvoke(DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion) { try { return new DynamicMetaObject( YacqExpression.List(this._symbols, args.SelectAll(o => o.Expression.Reduce(this._symbols).TryConvert(target.RuntimeType)) .StartWith(target.Expression.Reduce(this._symbols).TryConvert(target.RuntimeType)) ).Reduce(this._symbols).TryConvert(typeof(Object)), target.Restrictions ); } catch (Exception ex) { return errorSuggestion ?? new DynamicMetaObject( Expression.Throw(Expression.Constant(ex), typeof(Object)), BindingRestrictions.Empty ); } }