Пятичасовая разница между суммами в формате datatable и Excel

Если вы только собираетесь использовать его, как только это будет хорошо, но если вы сделаете это, вы должны попытаться сделать еще более общий материал. Я написал сообщение в блоге о том, как написать метод расширения для 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: я добавил часть с помощью словаря сопоставлений, но не нашел " я попробовал это сам, чтобы он не компилировался. Тем не менее, концепция существует, и я думаю, что она работает.

0
задан Nisse Engström 13 July 2018 в 09:52
поделиться