В моей программе я представляю динамические объекты с помощью словаря, например:
public class MyObject
{
public Guid Id { get; set; }
public Dictionary<string, object> Values { get; set; }
public MyObject()
{
Id = Guid.NewGuid();
Values = new Dictionary<string, object>();
}
public int InternalAndUnneeded {get;set;} // I don't want to expose it
}
Эти объекты могут сохранять свойства любого типа, включая сам тип MyObject.И я хочу спроецировать всю иерархию на новую иерархию MyObjectDto
:
public class MyObjectDto
{
public Guid Id { get; set; }
public Dictionary<string, object> Values { get; set; }
}
. Я написал простой тест:
[Test]
public void HierarchicalTest()
{
MapperConfiguration config = new MapperConfiguration(c => {
c.CreateMap<MyObject, MyObjectDto>();
});
var mapper = config.CreateMapper();
// prepare: Order references Customer
MyObject customer = new MyObject();
customer.Values.Add("FirstName", "John");
customer.Values.Add("LastName", "Doe");
customer.Values.Add("Age", 38);
MyObject order = new MyObject();
order.Values.Add("Title", "Nails, 1000 items");
order.Values.Add("Total", 890.50m);
order.Values.Add("Customer", customer);
MyObjectDto dto = mapper.Map<MyObjectDto>(order);
Assert.That(dto, Is.TypeOf<MyObjectDto>());
Assert.That(dto.Values["Customer"], Is.TypeOf<MyObjectDto>());
}
Но он проваливается во втором утверждении:
Ожидаемый PublicAPI.Unit.Tests.MyObjectDto
Но был PublicAPI.Unit.Tests.MyObject
По сути, он переводит только объект верхнего уровня, но объекты, хранящиеся в виде значений в словаре, не переводятся.Как заставить Automapper проецировать дерево на полную глубину?