private DynamicMetaObject TryPropertyPut(SetMemberBinder binder, DynamicMetaObject value) { ComMethodDesc method; bool holdsNull = value.Value == null && value.HasValue; if (_self.TryGetPropertySetter(binder.Name, out method, value.LimitType, holdsNull) || _self.TryGetPropertySetterExplicit(binder.Name, out method, value.LimitType, holdsNull)) { BindingRestrictions restrictions = IDispatchRestriction(); Expression dispatch = Expression.Property( Helpers.Convert(Expression, typeof(IDispatchComObject)), typeof(IDispatchComObject).GetProperty("DispatchObject") ); var result = new ComInvokeBinder( new CallInfo(1), new[] { value }, new bool[] { false }, restrictions, Expression.Constant(method), dispatch, method ).Invoke(); // Make sure to return the value; some languages need it. return(new DynamicMetaObject( Expression.Block(result.Expression, Expression.Convert(value.Expression, typeof(object))), result.Restrictions )); } return(null); }
private DynamicMetaObject BindComInvoke(ComMethodDesc method, DynamicMetaObject[] indexes, CallInfo callInfo, bool[] isByRef, List<ParameterExpression> temps, List<Expression> initTemps) { var callable = Expression; var dispCall = Helpers.Convert(callable, typeof(DispCallable)); DynamicMetaObject invoke = new ComInvokeBinder( callInfo, indexes, isByRef, DispCallableRestrictions(), Expression.Constant(method), Expression.Property( dispCall, typeof(DispCallable).GetProperty("DispatchObject") ), method ).Invoke(); if ((temps != null) && (temps.Any())) { Expression invokeExpression = invoke.Expression; Expression call = Expression.Block(invokeExpression.Type, temps, initTemps.Append(invokeExpression)); invoke = new DynamicMetaObject(call, invoke.Restrictions); } return invoke; }
private DynamicMetaObject BindComInvoke(DynamicMetaObject[] args, ComMethodDesc method, CallInfo callInfo, bool[] isByRef, List<ParameterExpression> temps, List<Expression> initTemps) { DynamicMetaObject invoke = new ComInvokeBinder( callInfo, args, isByRef, IDispatchRestriction(), Expression.Constant(method), Expression.Property( Helpers.Convert(Expression, typeof(IDispatchComObject)), typeof(IDispatchComObject).GetProperty("DispatchObject") ), method ).Invoke(); if ((temps != null) && (temps.Any())) { Expression invokeExpression = invoke.Expression; Expression call = Expression.Block(invokeExpression.Type, temps, initTemps.Append(invokeExpression)); invoke = new DynamicMetaObject(call, invoke.Restrictions); } return invoke; }
private DynamicMetaObject TryPropertyPut(SetMemberBinder binder, DynamicMetaObject value) { ComMethodDesc method; bool holdsNull = value.Value == null && value.HasValue; if (_self.TryGetPropertySetter(binder.Name, out method, value.LimitType, holdsNull) || _self.TryGetPropertySetterExplicit(binder.Name, out method, value.LimitType, holdsNull)) { BindingRestrictions restrictions = IDispatchRestriction(); Expression dispatch = Expression.Property( Helpers.Convert(Expression, typeof(IDispatchComObject)), typeof(IDispatchComObject).GetProperty("DispatchObject") ); var result = new ComInvokeBinder( new CallInfo(1), new[] { value }, new bool[] { false }, restrictions, Expression.Constant(method), dispatch, method ).Invoke(); // Make sure to return the value; some languages need it. return new DynamicMetaObject( Expression.Block(result.Expression, Expression.Convert(value.Expression, typeof(object))), result.Restrictions ); } return null; }