public override DynamicMetaObject BindInvoke(InvokeBinder binder, DynamicMetaObject[] args) { Requires.NotNull(binder); if (_self.TryGetGetItem(out ComMethodDesc method)) { bool[] isByRef = ComBinderHelpers.ProcessArgumentsForCom(ref args); return(BindComInvoke(args, method, binder.CallInfo, isByRef)); } return(base.BindInvoke(binder, args)); }
public override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes) { Requires.NotNull(binder); if (_self.TryGetGetItem(out ComMethodDesc getItem)) { bool[] isByRef = ComBinderHelpers.ProcessArgumentsForCom(ref indexes); return(BindComInvoke(indexes, getItem, binder.CallInfo, isByRef)); } return(base.BindGetIndex(binder, indexes)); }
private DynamicMetaObject BindGetOrInvoke(DynamicMetaObject[] args, CallInfo callInfo) { IDispatchComObject target = _callable.DispatchComObject; string name = _callable.MemberName; if (target.TryGetMemberMethod(name, out ComMethodDesc method) || target.TryGetMemberMethodExplicit(name, out method)) { bool[] isByRef = ComBinderHelpers.ProcessArgumentsForCom(ref args); return(BindComInvoke(method, args, callInfo, isByRef)); } return(null); }
public override DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args) { Requires.NotNull(binder, nameof(binder)); if (_self.TryGetMemberMethod(binder.Name, out ComMethodDesc method) || _self.TryGetMemberMethodExplicit(binder.Name, out method)) { bool[] isByRef = ComBinderHelpers.ProcessArgumentsForCom(ref args); return(BindComInvoke(args, method, binder.CallInfo, isByRef)); } return(base.BindInvokeMember(binder, args)); }
public override DynamicMetaObject BindSetIndex(SetIndexBinder binder, DynamicMetaObject[] indexes, DynamicMetaObject value) { Requires.NotNull(binder); if (_self.TryGetSetItem(out ComMethodDesc setItem)) { bool[] isByRef = ComBinderHelpers.ProcessArgumentsForCom(ref indexes); isByRef = isByRef.AddLast(false); DynamicMetaObject result = BindComInvoke(indexes.AddLast(value), setItem, binder.CallInfo, isByRef); // 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(base.BindSetIndex(binder, indexes, value)); }
public override DynamicMetaObject BindSetIndex(SetIndexBinder binder, DynamicMetaObject[] indexes, DynamicMetaObject value) { IDispatchComObject target = _callable.DispatchComObject; string name = _callable.MemberName; bool holdsNull = value.Value == null && value.HasValue; if (target.TryGetPropertySetter(name, out ComMethodDesc method, value.LimitType, holdsNull) || target.TryGetPropertySetterExplicit(name, out method, value.LimitType, holdsNull)) { bool[] isByRef = ComBinderHelpers.ProcessArgumentsForCom(ref indexes); isByRef = isByRef.AddLast(false); DynamicMetaObject result = BindComInvoke(method, indexes.AddLast(value), binder.CallInfo, isByRef); // 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(base.BindSetIndex(binder, indexes, value)); }