17,748
社区成员




public class QueryCustomerReq
{
public string PhoneNumber { get; set; }
public string PostalCode { get; set; }
}
var oParam = {};
oParam.PhoneNumber = "XXXXXXXXX";
oParam.PostalCode = "YYYYYYYY";
public class RemoteInvoke : HttpHandlerBase
{
private delegate object DynamicMethodDelegate(string json, RemoteSink remoteSink);
protected override object ProcessRequest()
{
base.ValidateCredential();
string methodName = HttpContext.Current.Request.Form["MethodName"];
string paramter = HttpContext.Current.Request.Form["Parameter"];
if (string.IsNullOrEmpty(methodName) ||
string.IsNullOrEmpty(paramter) )
{
throw new ArgumentException("The input parameters are required.");
}
RemoteSink sink = new RemoteSink();
Type type = sink.GetType();
MethodInfo methodInfo = type.GetMethod(methodName, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance);
if (methodInfo == null)
throw new ArgumentException("Error, cannot find the specific method by name.");
ParameterInfo[] paramInfos = methodInfo.GetParameters();
if (paramInfos == null ||
paramInfos.Length != 1 )
{
throw new ArgumentException("Error, method requires more than one paramter.");
}
Type[] newMethodArgs = { typeof(string), type };
DynamicMethod newMethod = new DynamicMethod( "dynamicMethod"
, typeof(object)
, newMethodArgs
, type.Module
);
ILGenerator generator = newMethod.GetILGenerator();
generator.Emit(OpCodes.Ldarg_1);
generator.Emit(OpCodes.Newobj, typeof(JavaScriptSerializer).GetConstructor(Type.EmptyTypes));
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Call, typeof(JavaScriptSerializer).GetMethod("Deserialize", BindingFlags.Public | BindingFlags.Instance).MakeGenericMethod(paramInfos[0].ParameterType));
generator.Emit(OpCodes.Callvirt, methodInfo);
generator.Emit(OpCodes.Ret);
DynamicMethodDelegate dynamicMethodDel
= (DynamicMethodDelegate)newMethod.CreateDelegate(typeof(DynamicMethodDelegate));
return dynamicMethodDel(paramter, sink);
}
}