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

Roe*_*elF 5 c# abstract-class interface automapper

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

public interface MyRepo 
{
    IEnumerable<IRootObject> GetItems(param);
}
Run Code Online (Sandbox Code Playgroud)

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; }
}
Run Code Online (Sandbox Code Playgroud)

所以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; }
}
Run Code Online (Sandbox Code Playgroud)

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

AutoMapper.Mapper.CreateMap<IRootObject, MyCustomRoot>
    .Include<IFirstSubObject, MyCustomFirstSub>
    .Include<ISecondSubObject, MyCustomSecondSub>();

AutoMapper.Mapper.CreateMap<IFirstSubObject, MyCustomFirstSub>();
AutoMapper.Mapper.CreateMap<ISecondSubObject, MyCustomSecondSub>();
Run Code Online (Sandbox Code Playgroud)

但我一直在获取MapperExceptions("无法构造抽象类",这在某种程度上是有意义的).我也打电话AssertConfigurationIsValid,这传递了这段代码.
如果我不作MyCustomRoot抽象类,则映射工作,但我得到的名单MyCustomRoot的对象,而实际上我想有一个列表MyCustomxxxSub,因为有一个工厂以后使用这个类型生成正确的UI ...

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

Roe*_*elF 8

好的,我找到了实际做到这一点的方法!所以使用上面提供的接口和类,你可以做这样的事情
(记住:MyCustomRoot类是抽象的)

AutoMapper.Mapper.CreateMap<IRootObject, MyCustomRoot>
    .Include<IFirstSubObject, MyCustomFirstSub>
    .Include<ISecondSubObject, MyCustomSecondSub>();
Run Code Online (Sandbox Code Playgroud)

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

public List<MyCustomRoot> PerformMapping(List<IRootObject> rootObjects)
{
    var returnList = new List<CustomRoot>();
    foreach(var rootObject in rootObjects)
    {
        var abstractObject = (MyCustomRoot)Mapper.Map(rootObject, rootObject.GetType(), typeof(MyCustomRoot));
        returnList.Add(abstractObject);
    }
    return returnList;
}
Run Code Online (Sandbox Code Playgroud)

现在我实际上得到了一个MyCustomRoot对象数组,这些都是具体的实现.

这正是我想要的!

  • 您能否更具体地说明这与您问题中的代码有何不同?我试过了,但仍然有“无法创建抽象类”异常...... (2认同)