示例#1
0
        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);
            }
        }
示例#2
0
        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;
        }