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