【问题标题】:AutoMapper: Map Interface to Abstract class - is this possible?AutoMapper:将接口映射到抽象类 - 这可能吗?
【发布时间】:2011-07-31 11:58:18
【问题描述】:

我正在使用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()call 实际上返回了一个只有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<IRootObject, MyCustomRoot>
    .Include<IFirstSubObject, MyCustomFirstSub>
    .Include<ISecondSubObject, MyCustomSecondSub>();

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

但我不断收到 MapperExceptions(“无法构造抽象类”,这在某种程度上是有道理的)。我也打电话给AssertConfigurationIsValid,这通过了这段代码。
如果我不使 MyCustomRoot 类抽象,那么映射工作,但我得到一个 MyCustomRoot 对象列表,而我实际上想要一个 MyCustomxxxSub 列表,因为稍后会有一个工厂它使用这种类型来生成正确的 UI...

我希望有人能为我指出正确的方向!
谢谢!

【问题讨论】:

    标签: c# interface abstract-class automapper


    【解决方案1】:

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

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

    然后使用以下 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;
    }
    

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

    这正是我想要的!

    【讨论】:

    • 您能否更具体地说明这与您问题中的代码有何不同?我试过了,但仍然有“无法创建抽象类”异常......
    • 好吧,似乎 4.x 版不起作用,但 3.2 版可以。很奇怪。
    【解决方案2】:

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

    【讨论】:

    • 嗯,不是真的。工厂位于另一层,它获取抽象MyCustomRoot 对象作为输入。无论如何感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 2011-05-22
    • 2022-11-19
    相关资源
    最近更新 更多