【问题标题】:Dealing with an object of certain type, that can be known in runtime only?处理某种类型的对象,只能在运行时知道?
【发布时间】:2015-04-07 16:48:25
【问题描述】:

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

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

为此,我正在使用 Newtonsoft.Json.Converter:

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

问题在于该类型&lt;T&gt; 在设计时是未知的。 但是在反序列化之后,我需要一个通用的强类型对象,以便我可以将它传递给 WCF 服务。原因是每个客户端的 WCF 服务不同,每个客户端的参数 input 可能有不同的结构。

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

这里的输入是 CalcEngine.CalcInputTypes 类型。 对于 clientA 和 clientB,CalcEngine.CalcInputTypes 可能有不同的结构。

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

谢谢。

【问题讨论】:

  • 您如何检测呼叫哪个客户端?当您在编译时知道您正在调用哪个客户端时,您在编译时就知道要为T填写什么@
  • 嗨 Scott,WCF ABC 配置(在 web.config 中)决定了调用什么服务。问题在于传递类型。但是现在变了,我跟团队验证过,传递参数的类型总是同名,但结构不同。这是一个不同的故事,因为在代码中我不需要知道结构以便将 JSON 字符串反序列化到该对象中,它会自动复制匹配属性的值。

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


【解决方案1】:

例如,假设您的输入可能是以下两条 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>();
}

【讨论】:

  • 哦,我在代码中不能有任何特定的类型引用!例如 - “Gizmo”这个东西永远不为人知,我不能假设我们会有预定的类型。这只能通过 .config 文件或其他方式进行配置,但不能在代码中进行配置。我在考虑依赖注入,但不确定。
  • 谢谢,蒂莫西,对不起,看起来需求已经改变,目标对象的类型没有改变,它具有相同的名称,但结构不同。在这种情况下,它是一个完全不同的故事。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 2013-05-26
  • 2023-02-13
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
相关资源
最近更新 更多