将列表转换为数据表
本文关键字:数据表 转换 列表 | 更新日期: 2023-09-27 18:35:28
这基本上是我之前发布的将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; }
}
现在,反序列化工作正常,但我无法转换为数据表。我正在使用我在SO中找到的ToDataTable扩展,这个代码片段应该将我的列表变成DataTable:
RootObject.Record.ToDataTable<Record>();
现在我当然不能这样做,因为 Record 不是静态成员,但是如果我将其设为静态,如下所示:
public static List<Record> record { get; set; }
并将 ToDataTable 扩展调用更改为
RootObject.record.ToDataTable<Record>();
它会中断从 JSON 到列表的转换。如果我验证"根"变量为空并且没有数据,则使用断点,因此当它尝试将其转换为 DataTable 时,整个事情都会崩溃,因为它只有空值。
您的RootObject
包含 Record
属性,因此您需要使用它来创建如下所示的DataTable
:
var root = JsonConvert.DeserializeObject<RootObject>(result);
root.Record.ToDataTable<Record>();
您尝试的是将其作为RootObject
类的静态成员访问,在这种情况下这是错误的,因为反序列化已经创建了RootObject
的实例。您现在只需要使用要转换为DataTable
的 Record
属性
这就是为什么我认为使用 var
关键字并不总是好的。有时您会忘记或忽略它是什么类型。如果你写:
RootObject root = JsonConvert.DeserializeObject<RootObject>(result);
您可能已经自己找到了解决方案。