public override DynamicMetaObject FallbackInvoke( DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion) { var deferArgs = Runtime.CheckDeferArgs(target, args); if (deferArgs != null) { return(Defer(deferArgs)); } if (target.Value == null) { return(Runtime.CheckTargetNullReference(target, "Not invokable: " + Runtime.CollectParameterInfo(target, args))); } if (Runtime.Prototypep(target.Value)) { var indexingExpr = Runtime.GetIndexingExpression(target, args); var restrictions = Runtime.GetTargetArgsRestrictions(target, args, false); if (indexingExpr == null) { return(errorSuggestion ?? Runtime.CreateThrow( target, args, restrictions, typeof(InvalidOperationException), "Not invokable: " + Runtime.CollectParameterInfo(target, args))); } return(new DynamicMetaObject(Runtime.EnsureObjectResult(indexingExpr), restrictions)); } if (target.LimitType.IsSubclassOf(typeof(Delegate))) { var parms = target.LimitType.GetMethod("Invoke").GetParameters(); if (parms.Length == args.Length) { // Don't need to check if argument types match parameters. // If they don't, users get an argument conversion error. var callArgs = Runtime.ConvertArguments(args, parms); var expression = Expression.Invoke( Expression.Convert(target.Expression, target.LimitType), callArgs); return(new DynamicMetaObject( Runtime.EnsureObjectResult(expression), BindingRestrictions.GetTypeRestriction(target.Expression, target.LimitType))); } } return(errorSuggestion ?? Runtime.CreateThrow( target, args, BindingRestrictions.GetTypeRestriction(target.Expression, target.LimitType), typeof(InvalidOperationException), "Not invokable: " + Runtime.CollectParameterInfo(target, args))); }
public override DynamicMetaObject FallbackSetIndex( DynamicMetaObject target, DynamicMetaObject[] indexes, DynamicMetaObject value, DynamicMetaObject errorSuggestion) { var deferArgs = Runtime.CheckDeferArgs(target, indexes); if (deferArgs != null) { return(Defer(deferArgs)); } if (target.Value == null) { return(Runtime.CheckTargetNullReference(target, "Cannot set index on null reference: " + target.LimitType.FullName + Runtime.CollectParameterInfo(target, indexes))); } Expression valueExpr = value.Expression; Debug.Assert(target.HasValue && target.LimitType != typeof(Array)); Type valueType; var indexingExpr = Runtime.GetIndexingExpression(target, indexes, out valueType); if (indexingExpr == null) { return(errorSuggestion ?? Runtime.CreateThrow( target, indexes, BindingRestrictions.Empty, typeof(InvalidOperationException), "No set indexer found: " + target.LimitType.FullName + Runtime.CollectParameterInfo(target, indexes))); } var setIndexExpr = Expression.Assign(indexingExpr, Expression.Convert(valueExpr, valueType)); BindingRestrictions restrictions = Runtime.GetTargetArgsRestrictions(target, indexes, false); return(new DynamicMetaObject(Runtime.EnsureObjectResult(setIndexExpr), restrictions)); }
public override DynamicMetaObject FallbackGetIndex( DynamicMetaObject target, DynamicMetaObject[] indexes, DynamicMetaObject errorSuggestion) { var deferArgs = Runtime.CheckDeferArgs(target, indexes); if (deferArgs != null) { return(Defer(deferArgs)); } if (target.Value == null) { var expr = Expression.Constant(null); var restrictions2 = BindingRestrictions.GetInstanceRestriction(target.Expression, null); return(new DynamicMetaObject(expr, restrictions2)); } // Find our own binding. // // Conversions created in GetIndexExpression must be consistent with // restrictions made in GetTargetArgsRestrictions. var indexingExpr = Runtime.GetIndexingExpression(target, indexes); if (indexingExpr == null) { return(errorSuggestion ?? Runtime.CreateThrow( target, indexes, BindingRestrictions.Empty, typeof(InvalidOperationException), "No get indexer found: " + target.LimitType.FullName + Runtime.CollectParameterInfo(target, indexes))); } var restrictions = Runtime.GetTargetArgsRestrictions(target, indexes, false); return(new DynamicMetaObject(Runtime.EnsureObjectResult(indexingExpr), restrictions)); }