/// <summary> /// Dynamically Invokes indexer using the DLR. /// </summary> /// <param name="target">The target.</param> /// <param name="indexes">The indexes.</param> /// <returns></returns> public static dynamic InvokeGetIndex(object target, params object[] indexes) { target = target.GetTargetContext(out var tContext, out var tStaticContext); indexes = Util.GetArgsAndNames(indexes, out var tArgNames); CallSite tCallSite = null; return(InvokeHelper.InvokeGetIndexCallSite(target, indexes, tArgNames, tContext, tStaticContext, ref tCallSite)); }
public override object Invoke(object target, params object[] args) { var tIContext = target as InvokeContext; if (tIContext != null) { target = tIContext.Target; } if (args == null) { args = new object[] { null }; } if (args.Length != _argCount) { switch (Kind) { case InvocationKind.Convert: if (args.Length > 0) { if (!Equals(args[0], _convertType)) { throw new ArgumentException("CacheableInvocation can't change conversion type on invoke.", "args"); } } if (args.Length > 1) { if (!Equals(args[1], _convertExplicit)) { throw new ArgumentException("CacheableInvocation can't change explict/implict conversion on invoke.", "args"); } } if (args.Length > 2) { goto default; } break; default: throw new ArgumentException("args", string.Format("Incorrect number of Arguments for CachedInvocation, Expected:{0}", _argCount)); } } switch (Kind) { case InvocationKind.Constructor: var tTarget = (Type)target; return(InvokeHelper.InvokeConstructorCallSite(tTarget, tTarget.IsValueType, args, _argNames, ref _callSite)); case InvocationKind.Convert: return(InvokeHelper.InvokeConvertCallSite(target, _convertExplicit, _convertType, _context, ref _callSite)); case InvocationKind.Get: return(InvokeHelper.InvokeGetCallSite(target, Name.Name, _context, _staticContext, ref _callSite)); case InvocationKind.Set: InvokeHelper.InvokeSetCallSite(target, Name.Name, args[0], _context, _staticContext, ref _callSite); return(null); case InvocationKind.GetIndex: return(InvokeHelper.InvokeGetIndexCallSite(target, args, _argNames, _context, _staticContext, ref _callSite)); case InvocationKind.SetIndex: Impromptu.InvokeSetIndex(target, args); return(null); case InvocationKind.InvokeMember: return(InvokeHelper.InvokeMemberCallSite(target, Name, args, _argNames, _context, _staticContext, ref _callSite)); case InvocationKind.InvokeMemberAction: InvokeHelper.InvokeMemberActionCallSite(target, Name, args, _argNames, _context, _staticContext, ref _callSite); return(null); case InvocationKind.InvokeMemberUnknown: { try { var tObj = InvokeHelper.InvokeMemberCallSite(target, Name, args, _argNames, _context, _staticContext, ref _callSite); return(tObj); } catch (RuntimeBinderException) { InvokeHelper.InvokeMemberActionCallSite(target, Name, args, _argNames, _context, _staticContext, ref _callSite2); return(null); } } case InvocationKind.Invoke: return(InvokeHelper.InvokeDirectCallSite(target, args, _argNames, _context, _staticContext, ref _callSite)); case InvocationKind.InvokeAction: InvokeHelper.InvokeDirectActionCallSite(target, args, _argNames, _context, _staticContext, ref _callSite); return(null); case InvocationKind.InvokeUnknown: { try { var tObj = InvokeHelper.InvokeDirectCallSite(target, args, _argNames, _context, _staticContext, ref _callSite); return(tObj); } catch (RuntimeBinderException) { InvokeHelper.InvokeDirectActionCallSite(target, args, _argNames, _context, _staticContext, ref _callSite2); return(null); } } case InvocationKind.AddAssign: InvokeHelper.InvokeAddAssignCallSite(target, Name.Name, args, _argNames, _context, _staticContext, ref _callSite, ref _callSite2, ref _callSite3, ref _callSite4); return(null); case InvocationKind.SubtractAssign: InvokeHelper.InvokeSubtractAssignCallSite(target, Name.Name, args, _argNames, _context, _staticContext, ref _callSite, ref _callSite2, ref _callSite3, ref _callSite4); return(null); case InvocationKind.IsEvent: return(InvokeHelper.InvokeIsEventCallSite(target, Name.Name, _context, ref _callSite)); default: throw new InvalidOperationException("Unknown Invocation Kind: " + Kind); } }