使用JsonConvert.DeserializeObject(Json.net)反序列化 - 按动态类型

时间:2013-12-30 10:13:48

标签: c# json .net-4.0 json.net deserialization

我有以下问题。 我有一个Enum,它定义了所有(对象)从基类继承的可能对象的类型。 现在,我知道我想要创建的对象的类型。

但是,我想防止代码重复。 所以为了做到这一点,我想做以下事情:

Type myType = null;
string myParemeters = "json valid value" // the value to deserialize from
switch (enumType)
{
    case EnumType.X:
        myType = typeof(X);                    
        break;
    case EnumType.Y:
        myType = typeof(Y);                    
        break;
}
if (myType != null)
{
    myRequest = JsonConvert.DeserializeObject<myType>(myParameters);
}

虽然myRequest是一个对象,可以是X,Y或Enum中列出的任何其他值(因为它们都是从基类继承的)。

但是,由于我收到以下错误,因此无法编译:

  

无法找到类型或命名空间名称'myType'(是吗?   缺少using指令或程序集引用?)

我现在的解决方案是在每种情况下创建实例..但我真的不想这样做。

有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

试试这个

JsonConvert.DeserializeObject(“somejson”,myType);

要理解为什么不能以您的方式将类型作为通用参数传递,请参阅此链接:

c-sharp-use-system-type-as-generic-parameter

我用这段代码来测试它:

    class TypeA : BaseClass {}

    class TypeB : BaseClass {}

    class BaseClass
    {
        public string Name { get; set; }
    }

    public enum Test
    {
        A = 0,
        B
    }

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    static void Main()
    {
        const Test enumType = Test.A;
        Type myType = null;

        switch (enumType)
        {
            case Test.A:
                myType = typeof(TypeA);                    
                break;
            case Test.B:
                myType = typeof(TypeB);                    
                break;
        }

        var result = JsonConvert.DeserializeObject("{ 'Name': 'test' }", myType);
  • 道歉,我误解了你原来的问题。已经复制了您的代码并实现了您的问题。