/// <summary> /// Dynamically Invokes a member method using the DLR /// </summary> /// <param name="target">The target.</param> /// <param name="name">The name. Can be a string it will be implicitly converted</param> /// <param name="args">The args.</param> /// <returns> The result</returns> /// <example> /// Unit test that exhibits usage: /// <code> /// <![CDATA[ /// dynamic tExpando = new ExpandoObject(); /// tExpando.Func = new Func<int, string>(it => it.ToString()); /// /// var tValue = 1; /// var tOut = Impromptu.InvokeMember(tExpando, "Func", tValue); /// /// Assert.AreEqual(tValue.ToString(), tOut); /// ]]> /// </code> /// </example> public static dynamic InvokeMember(object target, String_OR_InvokeMemberName name, params object[] args) { target = target.GetTargetContext(out var context, out var staticContext); args = Util.GetArgsAndNames(args, out var argNames); CallSite callSite = null; return(InvokeHelper.InvokeMemberCallSite(target, (InvokeMemberName)name, args, argNames, context, staticContext, ref callSite)); }
///<summary> /// Dynamically Invokes a member method using the DLR ///</summary> ///<param name="target"> The target. </param> ///<param name="name"> The name. Can be a string it will be implicitly converted </param> ///<param name="args"> The args. </param> ///<returns> The result </returns> ///<example> /// Unit test that exhibits usage: <code> /// <![CDATA[ /// dynamic tExpando = new ExpandoObject(); /// tExpando.Func = new Func<int, string>(it => it.ToString()); /// /// var tValue = 1; /// var tOut = Impromptu.InvokeMember(tExpando, "Func", tValue); /// /// Assert.AreEqual(tValue.ToString(), tOut); /// ]]> /// </code> ///</example> public static dynamic InvokeMember(object target, String_OR_InvokeMemberName name, params object[] args) { string[] tArgNames; Type tContext; bool tStaticContext; target = target.GetTargetContext(out tContext, out tStaticContext); args = Util.GetArgsAndNames(args, out tArgNames); CallSite tCallSite = null; return(InvokeHelper.InvokeMemberCallSite(target, 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); } }