/// <summary> /// Performs the binding of the dynamic get index operation if the target dynamic object cannot bind. /// </summary> /// <param name="target">The target of the dynamic get index operation.</param> /// <param name="indexes">The arguments of the dynamic get index operation.</param> /// <param name="errorSuggestion">The binding result to use if binding fails, or null.</param> /// <returns>The <see cref="DynamicMetaObject"/> representing the result of the binding.</returns> public override DynamicMetaObject FallbackGetIndex(DynamicMetaObject target, DynamicMetaObject[] indexes, DynamicMetaObject errorSuggestion) { #if ENABLECOMBINDER DynamicMetaObject com; if (!BinderHelper.IsWindowsRuntimeObject(target) && ComBinder.TryBindGetIndex(this, target, indexes, out com)) { return(com); } #endif return(BinderHelper.Bind(this, _binder, BinderHelper.Cons(target, indexes), _argumentInfo, errorSuggestion)); }
public override DynamicMetaObject FallbackGetIndex(DynamicMetaObject target, DynamicMetaObject[] indexes, DynamicMetaObject errorSuggestion) { if (ComBinder.TryBindGetIndex(this, target, indexes, out DynamicMetaObject result)) { return(result); } if (!target.HasValue || indexes.Any(x => !x.HasValue)) { return(Defer(target, indexes)); } var expression = RuntimeHelpers.EnsureObjectResult(RuntimeHelpers.GetIndexingExpression(target, indexes)); var restrictions = RuntimeHelpers.GetTargetArgsRestrictions(target, indexes, false); return(new DynamicMetaObject(expression, restrictions)); }
public override DynamicMetaObject FallbackGetIndex( DynamicMetaObject target, DynamicMetaObject[] indexes, DynamicMetaObject errorSuggestion) { #if !SILVERLIGHT // First try COM binding. DynamicMetaObject result; if (ComBinder.TryBindGetIndex(this, target, indexes, out result)) { return(result); } #endif // Defer if any object has no value so that we evaulate their // Expressions and nest a CallSite for the InvokeMember. if (!target.HasValue || indexes.Any((a) => !a.HasValue)) { var deferArgs = new DynamicMetaObject[indexes.Length + 1]; for (int i = 0; i < indexes.Length; i++) { deferArgs[i + 1] = indexes[i]; } deferArgs[0] = target; return(Defer(deferArgs)); } var restrictions = RuntimeHelpers.GetTargetArgsRestrictions( target, indexes, false); if (target.HasValue && target.Value == null) { return(errorSuggestion ?? RuntimeHelpers.CreateThrow(target, indexes, restrictions, typeof(NullReferenceException), "Object reference not set to an instance of an object.")); } var indexingExpr = RuntimeHelpers.EnsureObjectResult( RuntimeHelpers.GetIndexingExpression(target, indexes)); return(new DynamicMetaObject(indexingExpr, restrictions)); }
public override DynamicMetaObject FallbackGetIndex(DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject?errorSuggestion) { // First try COM binding. if (ComBinder.TryBindGetIndex(this, target, args, out var result)) { return(result); } // Defer if any object has no value so that we evaulate their Expressions and nest a // CallSite for the InvokeMember. if (!target.HasValue || Array.Exists(args, a => !a.HasValue)) { var deferArgs = new DynamicMetaObject[args.Length + 1]; deferArgs[0] = target; args.CopyTo(deferArgs.AsSpan(1)); return(Defer(deferArgs)); } // Give good error for Cons. if (target.LimitType == typeof(Cons)) { if (args.Length != 1) { return(errorSuggestion ?? RuntimeHelpers.CreateThrow(target, args, BindingRestrictions.Empty, typeof(InvalidOperationException), $"Indexing list takes single index. Got {args.Length}")); } } // Find our own binding. // Conversions created in GetIndexExpression must be consistent with restrictions made in GetTargetArgsRestrictions. var indexingExpr = RuntimeHelpers.EnsureObjectResult(RuntimeHelpers.GetIndexingExpression(target, args)); var restrictions = RuntimeHelpers.GetTargetArgsRestrictions(target, args, false); return(new DynamicMetaObject(indexingExpr, restrictions)); }