动态到自定义C#对象

时间:2013-10-04 21:23:52

标签: c# json serialization dynamic deserialization

我正在尝试将包含JSON数据的动态对象转换为自定义c#对象,并收到以下错误:

  

RuntimeBinderException最佳重载方法匹配   Newtonsoft.Json.JsonConvert.DeserializeObject(string,System.Type,   params Newtonsoft.Json.JsonConverter [])'有一些无效的参数

名为communication的变量是dynamic对象,包含以下值(JSON数据):

{
  "name": "inGame",
  "selected": true,
  "image": "assets/img/communication/ingame.png"
}

这里是应该将动态转换为自定义c#对象的代码:

InGameCommunication  inherited = JsonConvert.DeserializeObject(communication, typeof(InGameCommunication),
                                                          new JsonSerializerSettings());

班级层次结构:

public abstract class Communication
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool Selected { get; set; }
}

public class InGameCommunication : Communication
    {
    }

public class SkypeCommunication : Communication
{
    public string Username { get; set; }
}

2 个答案:

答案 0 :(得分:1)

您已声明communicationdynamic个对象。但是,这并不能免除类型安全。在运行时communication仍然需要是一个字符串(如错误消息中所述)。

您通过创建变量dynamic来绕过编译器错误,但在运行时如果变量不是字符串或者可以推断它仍将抛出的转换。

请参阅msdn reference,特别是有关重载决策的标题。

答案 1 :(得分:0)

该代码看起来应该有效。你能说明你如何声明变量Type

应该是

var type = typeof(InGameCommunication);