【发布时间】: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 时,整个事情都会崩溃,因为它只有空值。
【问题讨论】:
-
是的,我愿意。如果我在没有静态的情况下调用它,我会得到:'非静态字段、方法或属性需要对象引用'