我有一个简单的WCF RESTful服务,只有一个操作,该操作将字符串作为参数void Process(string item)
。item
是一个 JSON 序列化对象,它可以是任何对象。
在这种特殊情况下,可以将大约 20 个不同的类发送到此服务。反序列化这些对象的正确和方便的方法是什么?我怎么知道 JSON 背后的实际内容?我可以包含一些Type
字段,并执行类似使用 Json.NET 的操作:
dynamic json = JsonConvert.DeserializeObject(input);
,检查json.Type
然后用JsonConvert.DeserializeObject<T>()
反序列化输入字符串,但我不确定这是一个好主意。你有什么想法吗?
尽管我会将 WCF 与注释中提到的许多 OperationContract 方法一起使用,但动态方式也是可能的。不要忘记,省略了许多检查,并且有很大的改进空间。只需将其视为 POC 工作即可。
假设您有一个要对其执行方法的服务器对象。
public class ServerClass1
{
public int Add(int i,int j)
{
return i + j;
}
public string Hello()
{
return "HELLO";
}
}
您以某种方式收到了这些 JSON 并动态执行
要求1 : {"method":"Add","parameters":[3,5]}
var res1 = Exec(req1, new ServerClass1());
要求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);
}