【问题标题】:Converting List to DataTable将列表转换为数据表
【发布时间】:2014-12-27 15:29:22
【问题描述】:

这基本上是对我之前发布的将 JSON 反序列化为 DataTable 的问题的后续。好了,过程差不多完成了,代码如下:

            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                result = streamReader.ReadToEnd();
                dynamic d = JObject.Parse(result);
            }


           var root = JsonConvert.DeserializeObject<RootObject>(result);




 public static DataTable ToDataTable<T>(this IList<T> data)
    {
        PropertyDescriptorCollection props =
        TypeDescriptor.GetProperties(typeof(T));
        DataTable table = new DataTable();
        for (int i = 0; i < props.Count; i++)
        {
            PropertyDescriptor prop = props[i];
            table.Columns.Add(prop.Name, prop.PropertyType);
        }
        object[] values = new object[props.Count];
        foreach (T item in data)
        {
            for (int i = 0; i < values.Length; i++)
            {
                values[i] = props[i].GetValue(item);
            }
            table.Rows.Add(values);
        }
        return table;
    }


  public class Record
    {
        public int StatusID { get; set; }
        public string Identifier { get; set; }
        public string Status { get; set; }
        public string StatusDate { get; set; }
        public string WorkedBy { get; set; }
        public string ContactedOn { get; set; }
        public string Email { get; set; }
    }

    public class RootObject
    {
        public  List<Record> Record { get; set; }


    }

现在,反序列化工作正常,但我无法转换为 DataTable。我正在使用我在 SO 中找到的 ToDataTable 扩展,这个 sn-p 应该把我的列表变成一个 DataTable:

RootObject.Record.ToDataTable<Record>();

现在我当然不能这样做,因为 Record 不是静态成员,但如果我将其设为静态,就像这样:

 public static List<Record> record { get; set; }

并将 ToDataTable 扩展调用更改为

 RootObject.record.ToDataTable<Record>();

它中断了从 JSON 到 List 的转换。如果我验证“根”变量为空且没有数据,则使用断点,因此当它尝试将其转换为 DataTable 时,整个事情都会崩溃,因为它只有空值。

【问题讨论】:

  • 是的,我愿意。如果我在没有静态的情况下调用它,我会得到:'非静态字段、方法或属性需要对象引用'

标签: c# json datatable


【解决方案1】:

您的RootObject 包含Record 属性,因此您需要使用它来创建DataTable,如下所示:

var root = JsonConvert.DeserializeObject<RootObject>(result);
root.Record.ToDataTable<Record>();

您尝试的是作为RootObject 类的静态成员访问它,在这种情况下这是错误的,因为反序列化已经创建了RootObject 的实例。您现在只需使用要转换为 DataTableRecord 属性。


这就是为什么我认为使用var 关键字并不总是好的原因。有时您会忘记或忽略它是什么类型。如果你写:

RootObject root = JsonConvert.DeserializeObject<RootObject>(result);

您可能已经自己找到了解决方案。

【讨论】:

  • 哦!我明白了,非常感谢这似乎有效(至少程序现在没有吹到我的脸上)
  • 感谢您的全程解释,学习了一些好东西。肯定会像那样应用它,感谢一百万它一切正常。
猜你喜欢
  • 1970-01-01
  • 2012-04-07
  • 2020-04-17
相关资源
最近更新 更多