public static string JsonCall(object source, string name, string[] jsonArgs, string[] excludedMethodNames) { var jss = new JavaScriptSerializer(); var type = source.GetType(); var method = type.GetMethod(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.FlattenHierarchy); if(method == null) return jss.JsonErrorResponse("Method not found"); if(!GetOperationContractMethods(type, excludedMethodNames).Any(m => m.Name == name)) return jss.JsonErrorResponse("Access to this method is not permitted"); var prms = method.GetParameters(); if(prms.Length != jsonArgs.Length) return jss.JsonErrorResponse("The method takes " + prms.Length + " arguments but " + jsonArgs.Length + " arguments were supplied"); object[] args = new object[prms.Length]; for(var i=0; i < args.Length; i++) { var prmType = prms[i].ParameterType; object val; try { val = jss.Deserialize(jsonArgs[i], prmType); } catch(Exception ex) { return jss.JsonErrorResponse("Unable to deserialize argument " + i + " to parameter type " + prmType.FullName + ": " + ex.Message); } args[i] = val; } object returnVal = null; try { if(method.ReturnType == typeof(void)) method.Invoke(source, args); else returnVal = method.Invoke(source, args); } catch(Exception ex) { return jss.JsonErrorResponse("Method call failed: " + ex.Message); } try { return jss.Serialize(returnVal); } catch(Exception ex) { return jss.JsonErrorResponse("Failed to serialize return value: " + ex.Message); } }