处理某种类型的对象,只能在运行时知道?

时间:2015-04-07 16:48:26

标签: c# asp.net .net json jint

我有一个问题,我们有一个可以为多个客户提供服务的ASP.NET网络应用。

唯一的区别是应用程序需要将一些JSON字符串转换为类型为<T>的.NET对象,以便将该对象传递给WCF服务。

为此,我使用的是Newtonsoft.Json.Converter:

T input = JsonConvert.DeserializeObject<T>(jsonInput);

问题是该类型<T>在设计时是未知的。 但是在反序列化之后,我需要一个通用的强类型对象,以便我可以将它传递给WCF服务。原因是每个客户端的WCF服务不同,参数输入可能会为每个客户端提供不同的结构。

var client = new CalcEngine.CalculatorClient();
var input = new CalcEngine.CalcInputTypes();
var result = client.Calculate(input);

此处输入的类型为CalcEngine.CalcInputTypes。 对于clientA和clientB,CalcEngine.CalcInputTypes可能具有不同的结构。

实现这一目标的最佳方法是什么?

感谢。

1 个答案:

答案 0 :(得分:0)

例如,假设您的输入可能是以下两条JSON消息之一:

{
  "type": "Gizmo",
  "value": {
    "name": "Banana"
  }
}

{
  "type": "Widget",
  "value": {
    "widget_id": 7,
    "data": [4, 2, 6, 3]
  }
}

您可以通过检查type然后将value反序列化为已知的.NET类型来决定如何反序列化传入消息。您可以使用JToken

执行此操作
var input = JToken.Parse(jsonInput);
var type = input["type"].ToObject<string>();
if (type == "Gizmo")
{
    var gizmo = input["value"].ToObject<Gizmo>();
}
else if (type == "Widget")
{
    var widget = input["value"].ToObject<Widget>();
}