public static void InvokeFromSerializedInvokeInfo(OffloadedInvokeParams invokeParams) { Type declaringType = Type.GetType(invokeParams.Type); if (declaringType == null) throw new ArgumentException(string.Format("Type {0} could not be found",invokeParams.Type)); var method = declaringType.GetMethod(invokeParams.Method, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static); if (method == null) throw new ArgumentException(string.Format("Method {0} could not be found", invokeParams.Type)); if (invokeParams.Parameters.HasItems()) { var methodParams = method.GetParameters(); if (invokeParams.Parameters.Length != methodParams.Length) throw new ArgumentException("Parameter count mismatch."); for (var i = 0; i < methodParams.Length; i++) { if (invokeParams.Parameters[i] == null || invokeParams.Parameters[i].GetType() == methodParams[i].ParameterType) continue; //try to convert it to the proper type string serializedJson = JsonConvert.SerializeObject(invokeParams.Parameters[i]); object deserializedObject = JsonConvert.DeserializeObject(serializedJson, methodParams[i].ParameterType); invokeParams.Parameters[i] = deserializedObject; } method.Invoke(null, invokeParams.Parameters); } else { method.Invoke(null, null); } }
public static OffloadedInvokeParams CreateMethodInvokeParameters(Expression<Action> action) { OffloadedInvokeParams invokeParams = new OffloadedInvokeParams(); MethodCallExpression body = action.Body as MethodCallExpression; if (body == null) { throw new ArgumentException("action must be a simple method call to a static method, like 'Logger"); } invokeParams.Type = body.Method.DeclaringType.AssemblyQualifiedName; invokeParams.Method = body.Method.Name; ParameterInfo[] parameters = body.Method.GetParameters(); if (parameters.Length > 0) { invokeParams.Parameters = new object[parameters.Length]; for (int i = 0; i < parameters.Length; i++) { Expression arg = body.Arguments[i]; ConstantExpression expression2 = arg as ConstantExpression; if (expression2 != null) { invokeParams.Parameters[i] = expression2.Value; } else { invokeParams.Parameters[i] = CachedExpressionCompiler.Evaluate(arg); } } } return invokeParams; }