2014-12-27 10 views
1

Это в основном следующий предыдущий вопрос, который я опубликовал для десериализации JSON в DataTable. Ну этот процесс почти завершен, это код:Преобразование списка в 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. Я использую ToDataTable расширение я нашел в SO, и этот фрагмент должен превратить свой список в DataTable:

RootObject.Record.ToDataTable<Record>(); 

Теперь, конечно, я не могу этого сделать, так как запись не является статическим членом, но если я сделать его статическим, например:

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

и изменить ToDataTable вызов расширения для

RootObject.record.ToDataTable<Record>(); 

это нарушает преобразование из JSON в списке. Использование контрольных точек, если я проверяю «корень» var своим нулем и не имеет данных, поэтому, когда он пытается превратить его в DataTable, вся ситуация падает, поскольку она имеет только нулевые значения.

+0

_ «Теперь, конечно, я не могу этого сделать» _ Кажется, это должно сработать. Вы получаете синтаксическую ошибку? –

+0

Да, да. Если я называю это без статичного, я получаю следующее: «Ссылка на объект требуется для нестатического поля, метода или свойства» –

+2

Похоже, вы хотите «root.Record.ToDataTable();', предполагая «root» является экземпляром 'RootObject'. –

ответ

3

Ваш RootObject содержит Record свойство, так что вы должны использовать его для создания DataTable вроде этого:

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

То, что вы пытались это получить к нему доступ, как статический memeber из RootObject класса, который находится в этом контекст неправильный, потому что десериализация создает уже экземпляр RootObject. Теперь вам просто нужно использовать свойство Record, которое вы хотите преобразовать в DataTable.


Вот почему я думаю, что это не всегда хорошо использовать var ключевое слово. Иногда вы забываете или контролируете, какой тип. Если вы написали:

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

Возможно, вы нашли решение самостоятельно.

+0

Ooooh !! Понимаю, большое спасибо, что, казалось, сработало (по крайней мере, программа не ударила мне в лицо) –

+0

Спасибо за все объяснение, наклонился что-то хорошее. Будет определенно применять его так, спасибо, миллион все это сработало. –

Смежные вопросы