Если вы только собираетесь использовать его, как только это будет хорошо, но если вы сделаете это, вы должны попытаться сделать еще более общий материал. Я написал сообщение в блоге о том, как написать метод расширения для DataTable
, который создает список объектов. Он работает по соглашению о том, что свойства в объекте должны иметь то же имя, что и столбцы в хранимой процедуре (я мог бы изменить имя в хранимой процедуре, если мог):
public static class DataTableExtensions
{
public static IList ToList(this DataTable table) where T : new()
{
IList properties = typeof(T).GetProperties().ToList();
IList result = new List();
foreach (var row in table.Rows)
{
var item = CreateItemFromRow((DataRow)row, properties);
result.Add(item);
}
return result;
}
public static IList ToList(this DataTable table, Dictionary mappings) where T : new()
{
IList properties = typeof(T).GetProperties().ToList();
IList result = new List();
foreach (var row in table.Rows)
{
var item = CreateItemFromRow((DataRow)row, properties, mappings);
result.Add(item);
}
return result;
}
private static T CreateItemFromRow(DataRow row, IList properties) where T : new()
{
T item = new T();
foreach (var property in properties)
{
property.SetValue(item, row[property.Name], null);
}
return item;
}
private static T CreateItemFromRow(DataRow row, IList properties, Dictionary mappings) where T : new()
{
T item = new T();
foreach (var property in properties)
{
if(mappings.ContainsKey(property.Name))
property.SetValue(item, row[mappings[property.Name]], null);
}
return item;
}
}
Теперь вы можно просто вызвать
var items = dt.ToList- ();
или
var mappings = new Dictionary();
mappings.Add("ItemId", "item_id");
mappings.Add("ItemName ", "item_name");
mappings.Add("Price ", "price);
var items = dt.ToList- (mappings);
Сообщение в блоге находится здесь: http://blog.tomasjansson.com/2010/11/convert-datatable -to-generic-list-extension
Существует множество способов расширить это, вы можете включить какой-то словарь сопоставлений, рассказывающий об расширении, как сопоставить столбцы таким образом имена не должны совпадать. Или вы можете добавить список имен свойств, которые вы хотели бы исключить при сопоставлении.
Обновление: ваш объект (Item
), который вы создаете, должен иметь конструктор по умолчанию, иначе частный метод не будет быть в состоянии создать его. Поскольку способ решения работает, сначала создать объект, чем использовать свойства, которые вы получаете от отражения, чтобы установить значения объекта.
Обновление 2: я добавил часть с помощью словаря сопоставлений, но не нашел " я попробовал это сам, чтобы он не компилировался. Тем не менее, концепция существует, и я думаю, что она работает.