Automapper - сопоставить свойства с IEnumerable - PullRequest
0 голосов
/ 23 марта 2020

Я создаю веб-API с .NetCore и EntityFramework Core. У меня есть объект на основе этой модели:

 public partial class Person
{
    public int Person_Id { get; set; }
    public string Nickname { get; set; }
    public string City { get; set; }
}

И у меня есть такой ресурс:

public string Property { get; set; }

public string V1 { get; set; }

public string V2 { get; set; }

Я хотел бы использовать Automapper для сопоставления каждого свойства модель (Person_Id, Nickname, City) для IEnumerable ресурса, так что я получаю что-то вроде этого:

[
 {
  Property: Person_Id,
  V1: null,
  V2: null
 },
 {
  Property: Nickname,
  V1: null,
  V2: null
 },
 {
  Property: City,
  V1: null,
  V2: null
 }
]

Таким образом, каждое свойство становится новой записью в IEnumerable. Как мне это сделать?

1 Ответ

0 голосов
/ 23 марта 2020

Этот вид логики c очень индивидуален, и я не думаю, что Automapper сможет справиться с этим просто потому, что это не отображение 1: 1, а 1: 3 (или даже больше, если вы хотите иметь больше свойств на вашем Person класс). Поэтому я предлагаю вам сделать это с помощью Reflection, вместо того, чтобы тратить время на Automapper. Не поймите меня неправильно - Automapper - лучшее, что есть для отображения 1: 1, но я никогда не видел, чтобы он использовался для такого сценария. Просто go пользовательские логи c:

public partial class Person
    {
        public int Person_Id { get; set; }
        public string Nickname { get; set; }
        public string City { get; set; }
    }

    public partial class Resource
    {
        public string Property { get; set; }
        public string V1 { get; set; }
        public string V2 { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var item = new Person()
            {
                Person_Id = 1,
                City = "New York",
                Nickname = "John"
            };

            PropertyInfo[] props = typeof(Person).GetProperties(BindingFlags.Public | BindingFlags.Instance);
            List<Resource> result = new List<Resource>();

            foreach (var prop in props)
            {
                result.Add(new Resource()
                {
                    Property = prop.Name,
                    V1 = prop.GetValue(item).ToString(),
                    V2 = null
                });
            }

            // result is now [ { Property: Person_Id, V1: "1", V2: null }, { Property: Nickname, V1: "John", V2: null }, { Property: City, V1: "New York", V2: null } ]
        }
    }

Конечно, вы можете ускорить процесс, не просматривая свойства, а просто жестко кодируя имена свойств, используя nameof(Person.Person_Id) и т. Д.

...