虽然我会在注释中提到的使用许多OperationContract方法的WCF,但动态方法也是可以的。不要忘记,许多支票都被省略了,并且有很大的改进空间。只是把它当作POC工作。
假设您有一个服务器对象来执行方法。
public class ServerClass1
{
public int Add(int i,int j)
{
return i + j;
}
public string Hello()
{
return "HELLO";
}
}
,你莫名其妙地收到了这些jsons和动态执行
REQ1:{"method":"Add","parameters":[3,5]}
var res1 = Exec(req1, new ServerClass1());
REQ 2:{"method":"Hello","parameters":null}
var res2 = Exec(req2, new ServerClass1());
种
辅助方法/类
public class Request
{
public string method;
public object[] parameters;
}
public static object Exec(string json, object target)
{
var req = JsonConvert.DeserializeObject<Request>(json);
var method = target.GetType().GetMethod(req.method, BindingFlags.Public | BindingFlags.Instance);
if (method == null) throw new InvalidOperationException();
object[] parameters = new object[0];
if (req.parameters != null)
{
parameters = method.GetParameters().Zip(req.parameters, (m, p) => Convert.ChangeType(p, m.ParameterType)).ToArray();
}
return method.Invoke(target, parameters);
}
的可能重复的[反序列化JSON到C#动态对象?](http://stackoverflow.com/questions/3142495/deserialize-json-into-c-sharp-dynamic -object) – celerno
你用JSON.net卡住了吗?你不能使用4.5中的WCF中的自动序列化吗? – crush
您还没有明确说明为什么您需要接受20个不同的“对象”作为单个OperationContract的参数,但我猜测您正在滥用OperationContract。如果您制作了多个OperationContracts,则每个接受您所期望的参数类型可能是最好的。 – crush