Конфигурация Automapper для сопоставления значений и членов базового словаря в обычном режимеC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Конфигурация Automapper для сопоставления значений и членов базового словаря в обычном режиме

Сообщение Anonymous »

У меня есть следующие классы.
public class FieldValue
{
public string Field { get; set; }
public object Value { get; set; }
}

public class FieldValues
{
public FieldValue[] Values { get; set; }
}

public static class FieldValuesExtensions
{
public static IDictionary ToDictionary(this FieldValues self)
{
return self.Values.ToDictionary(v => v.Field, v => v.Value);
}
}

public class SourceClass : FieldValues
{
public int Id { get; set; }
public string Name { get; set; }
}

public class DestinationClassA
{
public int Id { get; set; }
public string Field1 { get; set; }
public string Field2 { get; set; }
}

public class DestinationClassB
{
public string Name { get; set; }
public string Field2 { get; set; }
public string Field3 { get; set; }
}

SourceClass является производным от FieldValues и имеет свои собственные поля. Типы DestinationClassX состоят только из полей.
Мне нужно сопоставить SourceClass с DestinationClassX следующим образом:
public class TestClass
{
public static void Test(IMapper mapper)
{
// create a SourceClass object
SourceClass source = new() {
Id = 123,
Name = "Foo",
Values = new FieldValue[] {
new() { Field = "Field1", Value = "Value1" },
new() { Field = "Field2", Value = "Value2" },
new() { Field = "Field3", Value = "Value3" },
new() { Field = "Field4", Value = "Value4" }
}
};

// how do we setup mapping configuration to achieve the following?

// map to DestinationClassA
DestinationClassA destinationA = mapper.Map(source);
// destinationA.Id == 123;
// destinationA.Field1 == "Value1";
// destinationA.Field2 == "Value2";

// map to DestinationClassB
DestinationClassB destinationB = mapper.Map(source);
// destinationB.Name == "Foo";
// destinationB.Field2 == "Value2";
// destinationB.Field3 == "Value3";
}
}

Мне нужно настроить сопоставление Automapper для сопоставления исходного класса с DestinationClassX, чтобы все соответствующие поля назначения сопоставлялись из:
  • любое соответствующее поле/значение из базовых значений полей SourceClass
  • а также любые соответствующие элементы из самого SourceClass, как обычно.
Я это понимаю Automapper может автоматически сопоставлять динамические объекты, а также IDictionary. Если у меня есть, например, класс с членом DestinationClassX:
public class DestinationClassWithA
{
public DestinationClassA A { get; set; }
}

со следующим сопоставлением:
CreateMap(); // map 1

CreateMap()
.ForMember(dst => dst.A, opt => opt.MapFrom(src => src.ToDictionary())); // map 2

Destination.A Field1 и Field2 заполняются согласно карте 2, но для идентификатора из карты 1 установлено значение null. Если я закомментирую карту 2, карта 1 будет работать, но, конечно, я не получу словарные статьи.
Я не уверен, как включить карту словаря (карта 2) в карту. 1.
CreateMap()
// what goes here?

CreateMap()
// what goes here?


Подробнее здесь: https://stackoverflow.com/questions/790 ... -as-normal
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»