/// <summary> /// Dynamically Invokes a member method which returns void using the DLR /// </summary> /// <param name="target">The target.</param> /// <param name="name">The name.</param> /// <param name="args">The args.</param> /// <example> /// Unit test that exhibits usage: /// <code> /// <![CDATA[ /// var tTest = "Wrong"; /// var tValue = "Correct"; /// /// dynamic tExpando = new ExpandoObject(); /// tExpando.Action = new Action<string>(it => tTest = it); /// /// Impromptu.InvokeMemberAction(tExpando, "Action", tValue); /// /// Assert.AreEqual(tValue, tTest); /// ]]> /// </code> /// </example> public static void InvokeMemberAction(object target, String_OR_InvokeMemberName name, params object[] args) { target = target.GetTargetContext(out var tContext, out var tStaticContext); args = Util.GetArgsAndNames(args, out var tArgNames); CallSite tCallSite = null; InvokeHelper.InvokeMemberActionCallSite(target, (InvokeMemberName)name, args, 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); } }