Я использую AutoMapper для сопоставления объектов между разными уровнями моего приложения. С одной стороны, у меня есть интерфейс выглядит следующим образом:
public interface MyRepo
{
IEnumerable<IRootObject> GetItems(param);
}
IRootObject выглядит так:
public interface IRootObject
{
int Id { get; set; }
DateTime? Date { get; set; }
}
public interface IFirstSubObject : IRootObject
{
string MyFirstProp { get; set; }
}
public interface ISecondSubObject : IRootObject
{
string MySecondProp { get; set; }
}
Таким образом, вызов GetItems ()
фактически возвращает массив только IxxxSubObjectItems
.
Вкл. с другой стороны структура выглядит так:
public abstract class MyCustomRoot
{
protected MyCustomRoot(){}
public int Id { get; set; }
public DateTime? Date { get; set; }
}
public class MyCustomFirstSub : MyCustomRoot
{
public MyCustomFirstSub() : base() {}
public string MyFirstProp { get; set; }
}
public class MyCustomSecondSub : MyCustomRoot
{
public MyCustomSecondSub () : base() {}
public string MySecondProp { get; set; }
}
Теперь я настроил преобразователь l Как и так
AutoMapper.Mapper.CreateMap<IRootObject, MyCustomRoot>
.Include<IFirstSubObject, MyCustomFirstSub>
.Include<ISecondSubObject, MyCustomSecondSub>();
AutoMapper.Mapper.CreateMap<IFirstSubObject, MyCustomFirstSub>();
AutoMapper.Mapper.CreateMap<ISecondSubObject, MyCustomSecondSub>();
Но я продолжаю получать MapperExceptions («Невозможно построить абстрактный класс», что в некотором смысле имеет смысл). Я также вызываю AssertConfigurationIsValid
, и это подходит для этого кода.
Если я не сделаю класс MyCustomRoot
абстрактным, то сопоставление будет работать, но я получу список объектов MyCustomRoot
, хотя на самом деле мне бы хотелось иметь список MyCustomxxxSub
, потому что позже появится Factory, который использует этот тип для генерации правильного пользовательского интерфейса ...
Я надеюсь, что кто-то может указать мне правильное направление для этого!
Спасибо!