2015-05-05 3 views
2

я следующий класс называется HIPЛучший способ Итерации Свойства класса

using System; 

namespace Shared 
{ 
    public class HIP 
    { 
     public HIP() 
     { 
     } 
     public double data_source { get; set; } 
     public string hid { get; set; } 
     public double wid { get; set; } 
     public double psn { get; set; } 
    } 
} 

И я получил OData и добавляя свойства каждого к списку следующим образом:

 var client= new ODataClient(settings); 

     var packages =await client.For("HIP").FindEntriesAsync(); 

     protected List<HIP> hcp = new List<HIP>(); 

     foreach (var package in packages) 
     { 
      hcp.Add(new HIP {wid=Convert.ToSingle(package["wid"])}); 
      hcp.Add(new HIP {hid=package["hid"].ToString()}); 
      hcp.Add(new HIP {psn=Convert.ToSingle(package["psn"])}); 
      hcp.Add(new HIP {data_source=Convert.ToSingle(package["data_source"])}); 

     } 

Мой вопрос заключается в том, как получить оптимальную/улучшенную работу foreach. Теперь у меня есть 4-5 свойств, и я могу набирать каждое название свойств следующим образом: package["wid"], package["hid"], package["psn"], package["data_source"]; однако что, если у меня есть десятки свойств. Я хотел бы знать, есть ли лучший способ повторения.

+2

вы могли бы использовать отражение ... –

+0

Не могли бы вы уточнить (давая пример) вашу идею? – casillas

+0

@ilyasUyanik все еще не ясно, что вы пытаетесь сделать, вы должны добавить новый элемент в список для каждого свойства из класса HIP, указанного в пакете? – Victor

ответ

2

Вы можете использовать отражение, чтобы сделать что-то вдоль линий:

var hcp = new List<HIP>(); 

var hipProperties = typeof(HIP).GetProperties(); 

hcp.AddRange(hipProperties.Select(prop => 
{ 
    var hip = new HIP(); 

    prop.SetValue(hip, Convert.ChangeType(package[prop.Name], prop.PropertyType), null); 

    return hip; 
}).ToList(); 

Приведенный выше код будет генерировать список HIP объектов только одного свойства, установленного на каждом. Я считаю, что вы можете создать единый HIP объект со всеми его свойствами, заданными для каждого пакета, например:

var client = new ODataClient(settings); 
var packages = await client.For("HIP").FindEntriesAsync(); 

var hcp = new List<HIP>(); 
var properties = typeof(Hip).GetProperties(); 

foreach (var p in packages) 
{ 
    var hip = new HIP(); 

    foreach (var prop in properties) 
    { 
     prop.SetValue(hip, Convert.ChangeType(p[prop.Name], prop.PropertyType), null); 
    } 

    hcp.Add(hip); 
} 
+0

У вас есть ключ к следующему вопросу http: // stackoverflow. ком/кв ОПРОСЫ/30103964/системы типа делает-не-содержать-а-определение-для-GetProperties – casillas

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