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, как обычно.
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