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); }