Список с отображением пары имя / значение на объект с помощью автоматического преобразователя - PullRequest
2 голосов
/ 01 октября 2019

Итак, у меня есть список строк со списком ячеек, каждая ячейка - это строка и объект:

public List<Row> Rows { get; set; }

public class Row
{
    public int Id { get; set; }
    public List<Cell> Cells { get; set; }
}

public class Cell
{
    public string Name { get; set; }
    public object Value { get; set; }
}

Вот пример с содержимым:

{
    new Row
    {
        Id = 0,
        Cells = new List<Cell>()
        {
            new Cell { Name = "prop1", Value = "somevalue1" },
            new Cell { Name = "prop2", Value = "somevalue2" },
            new Cell { Name = "prop3", Value = 3 },
            new Cell { Name = "prop4", Value = "24-09-2019 12:27:04" }
        }
    },
    new Row
    {
        Id = 0,
        Cells = new List<Cell>()
        {
            new Cell { Name = "prop1", Value = "somevalue3" },
            new Cell { Name = "prop2", Value = "somevalue4" },
            new Cell { Name = "prop3", Value = 3 },
            new Cell { Name = "prop4", Value = "24-09-2019 12:27:04" }
        }
    }
};

Я хочу сопоставить это с объектом:

public class CustomObj
{
    public string prop1 { get; set; }
    public string prop2 { get; set; }
    public int prop3 { get; set; }
    public DateTime? prop4 { get; set; }
}

Но как это можно сделать в Automapper? Я начал работать, преобразовав списки ячеек в словари, а затем с помощью автоматического преобразователя, но при преобразовании даты и времени произошел сбой. Моя текущая реализация работает с использованием GetProperty (), но было бы неплохо, если бы я мог сделать то же самое с automapper.

1 Ответ

0 голосов
/ 01 октября 2019

Это может быть довольно просто без Automapper.

public static CustomRow ToCustomRow(this row)
{
    var values = row.Cells.ToDictionary(cell => cell.Name);

    int.TryParse(values.GetValueOrDefault("prop3"), out var prop3);
    DateTime.TryParse(values.GetValueOrDefault("prop4"), out var prop4);

    return new CustomRow
    {
        prop1 = values.GetValueOrDefault("prop1"),
        prop2 = values.GetValueOrDefault("prop2"),
        prop3 = prop3,
        prop4 = prop4
}

Цель Automapper состоит в том, чтобы уменьшить объем печати для простого сопоставления, более сложные случаи будут гораздо быстрее и понятнее писать вручную.

...