這基本上是我發佈的反序列化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; }
}
現在,反序列化可以正常使用,但我不能轉換爲數據表。我現在用的是ToDataTable延長我在SO發現,這個片段應該把我的列表轉換成一個DataTable:
RootObject.Record.ToDataTable<Record>();
現在當然我不能這樣做,因爲記錄不是一個靜態成員,但如果我使靜態的,就像這樣:
public static List<Record> record { get; set; }
和ToDataTable分機呼叫切換到
RootObject.record.ToDataTable<Record>();
它打破了從JSON轉換到列表。如果我使用斷點來驗證「root」var是否爲null並且沒有數據,那麼當它試圖將它變成一個DataTable時,整個事件就會崩潰,因爲它只有空值。
_「現在當然我不能這樣做」_似乎應該有效。你是否收到語法錯誤? – 2014-12-27 15:43:38
是的,我願意。如果我在沒有靜態的情況下調用它,我會得到這樣的結果:'非靜態字段,方法或屬性需要一個對象引用' – 2014-12-27 15:49:24
看起來像'root.Record.ToDataTable();',假設'root'是'RootObject'的一個實例。 – 2014-12-27 15:55:05