AutoMapper:将接口映射到抽象类 – 这可能吗?

我正在使用AutoMapper在我的应用程序的不同层之间映射对象。 一方面我有一个如下所示的界面:

public interface MyRepo { IEnumerable 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; } } 

现在我已经像这样设置了映射器

 AutoMapper.Mapper.CreateMap .Include .Include(); AutoMapper.Mapper.CreateMap(); AutoMapper.Mapper.CreateMap(); 

但我继续得到MapperExceptions(“不能构造抽象类”,这在某种程度上是有道理的)。 我也调用AssertConfigurationIsValid ,并传递此代码。
如果我不使MyCustomRoot类抽象,那么映射可以工作,但我得到一个MyCustomRoot对象列表,而我实际上想要一个MyCustomxxxSub列表,因为稍后有一个Factory使用这个类型生成正确的用户界面……

我希望有人可以指出我正确的方向!
谢谢!

好的,我找到了实际做到这一点的方法! 因此,使用上面提供的接口和类,您可以执行类似的操作
(记住: MyCustomRoot类是抽象的)

 AutoMapper.Mapper.CreateMap .Include .Include(); 

然后使用followig Map调用来映射对象:

 public List PerformMapping(List rootObjects) { var returnList = new List(); foreach(var rootObject in rootObjects) { var abstractObject = (MyCustomRoot)Mapper.Map(rootObject, rootObject.GetType(), typeof(MyCustomRoot)); returnList.Add(abstractObject); } return returnList; } 

现在我实际上获得了一个MyCustomRoot对象数组,这些对象都是特定的实现。

这正是我想要的!

如果是这样,那么你想映射到那个工厂,注入它并让它在适当的时候创建正确的实例,因为它显然知道要实例化的工厂。