动态类型化列表,使用反射反序列化

本文关键字:反射 反序列化 类型化 列表 动态 | 更新日期: 2023-09-27 17:50:14

我有一个小问题。我应该通过c#中的json.net库来反序列化json。我不明白你怎么能切换输入粗体的列表,当然,所有使用反射,因为我在做一个泛型方法。

有人能给我开导一下吗?或解决方案:)

public static void insertTable(String json, String table)
{     
        using (localDBService db = new localDBService())
        {
            dynamic item = Activator.CreateInstance(Type.GetType("eStartService." + table));
            item = JsonConvert.DeserializeObject(json); 
            try
            {
                var set = db.Set(item.GetType());
                set.Add(item);
                db.SaveChanges();
                log.Info("Scritto sul database dal metodo InsertTable");
            }
            catch (Exception ex)
            {
                log.Info("ERRORE DI SCRITTURA SUL DATABASE METODO : insertTable");
                throw ex;
            }
        }    
}

错误:实体类型JArray不是当前上下文模型的一部分。

感谢

我的需要是能够读取json,反序列化在你的对象动态,因为你看到我现在…从我粘的那个错误中解脱出来。

动态类型化列表,使用反射反序列化

我们应该基于特定类型(如

)创建List<>的通用类型。
var listType = typeof (List<>).MakeGenericType(type);

下面是一个完整的示例,将json值反序列化为具有自定义类型的列表:

    public static void insertTable(String json, String table)
    {
        using (localDBService db = new localDBService())
        {
            var tableType = Type.GetType("eStartService." + table);
            var list = DeserializeList(json, tableType);
            try
            {
                var set = db.Set(tableType);
                foreach (var item in list)
                    set.Add(item);
                db.SaveChanges();
                log.Info("Scritto sul database dal metodo InsertTable");
            }
            catch (Exception ex)
            {
                log.Info("ERRORE DI SCRITTURA SUL DATABASE METODO : insertTable");
                throw ex;
            }
        }
    }

    private static IList DeserializeList( string value,Type type)
    {
        var listType = typeof (List<>).MakeGenericType(type);
        var list = JsonConvert.DeserializeObject(value, listType);
        return list as IList;
    }