1

我正在使用Automapper将接口复制到不同的实现(用于序列化、视图模型、数据库映射等)。

我的代码要复杂得多,但我已在以下代码片段示例中隔离了问题。

考虑到下面的代码,我是否因为第二个断言失败而错过了什么:

    [Test]
    public void AutoMapperTest()
    {
        Mapper.CreateMap<IMyBaseInterface, MyClass>();
        Mapper.CreateMap<IMyInterface, MyClass>();            
        IMyBaseInterface baseInstance = new MyBaseClass{ MyBaseProperty = "MyBase" };
        var concrete = Mapper.Map<MyClass>(baseInstance);
        concrete.MyClassProperty = "MyClass";
        MyClass mapped = Mapper.Map<IMyInterface,MyClass>(concrete);
        Assert.AreEqual(concrete.MyBaseProperty, mapped.MyBaseProperty);
        Assert.AreEqual(concrete.MyClassProperty, mapped.MyClassProperty);
    }

预期:“MyClass”但是是:null

public class MyClass : MyBaseClass, IMyInterface
{
    public string MyClassProperty { get; set; }        
}

public interface IMyInterface : IMyBaseInterface
{
    string MyClassProperty { get; }        
}

public class MyBaseClass : IMyBaseInterface
{
    public string MyBaseProperty { get; set; }
}

public interface IMyBaseInterface
{
    string MyBaseProperty { get; } 
}

环境:

自动映射器: 4.1.1.0 / .Net: 4.5 / VS 2013

4

2 回答 2

1

解决方法: 添加Mapper.CreateMap<MyClass, MyClass>();

我不认为上述是一个真正的答案。因为这意味着如果我有多个实现,我必须为所有组合创建映射。如果我编写一个新实现,则添加另一个映射,即使整个时间,它们都实现相同的接口。

于 2015-12-27T11:10:22.597 回答
1

如果你正在使用继承并且你想将它与你结合起来,Automapper你不得不说Automapper这个类是这些类的基础,而这些类是这个类的子类。我遇到了同样的问题,只有当我指定所有继承关系时它才开始工作

最好查看这个关于继承配置的文档页面

于 2015-12-27T12:25:14.623 回答