AutoMapper-类型的条件映射 [英] AutoMapper - Conditional Mapping for Type

查看:90
本文介绍了AutoMapper-类型的条件映射的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想做以下事情,我想知道是否有人知道怎么做:

I'd like to do something like the following and I'm wondering if someone knows how to do it:

Mapper.CreateMap<Worksheet, V2WorksheetModel>().If(pWorksheet=> pWorksheet.VisitLevel == 2);
Mapper.CreateMap<Worksheet, V3WorksheetModel>().If(pWorksheet=> pWorksheet.VisitLevel == 3);

Worksheet entityVisit2 = MyService.GetWorksheetByID(100); //visit level 2
Worksheet entityVisit3 = MyService.GetWorksheetByID(150); //visit level 3
WorksheetModelBase modelBase1 = Mapper.Map(entityVisit2);  
WorksheetModelBase modelBase2 = Mapper.Map(entityVisit3);  
Assert.True(modelBase is V2WorksheetModel);
Assert.True(modelBase2 is V3WorksheetModel);

因此,我希望Mapper.Map()返回WorksheetModelBase的正确派生类型.这可能吗? (我知道我可以在调用代码处执行if语句,但是如果我可以使用这一条Mapper.Map行返回正确的类,那就太酷了.)

So I'd like Mapper.Map() to return the correct derived type of WorksheetModelBase. is this possible? (I know I can just do the if statement at the calling code, but it'd be cool if I could use this one Mapper.Map line to return the right class.)

谢谢!

推荐答案

除了映射V2WorksheetModel和V3WorksheetModel,还可以仅映射到基类吗? 如果是,则可以在映射中使用ConstructUsing:

Instead of mapping V2WorksheetModel and V3WorksheetModel can you map just to the base class? If yes you can then use ConstructUsing in your mapping:

[Test]
public void Test1()
{
    Mapper.CreateMap<Worksheet, WorksheetModelBase>().ConstructUsing(GetWorksheetModel);

    Worksheet entityVisit2 = new Worksheet { VisitLevel = 2 };
    Worksheet entityVisit3 = new Worksheet { VisitLevel = 3 };

    var modelBase1 = Mapper.Map<WorksheetModelBase>(entityVisit2);
    var modelBase2 = Mapper.Map<WorksheetModelBase>(entityVisit3);

    Assert.IsTrue(modelBase1 is V2WorksheetModel);
    Assert.IsTrue(modelBase2 is V3WorksheetModel);
}

private WorksheetModelBase GetWorksheetModel(ResolutionContext context)
{
    var worksheet = (Worksheet) context.SourceValue;
    if (worksheet.VisitLevel == 2)
        return new V2WorksheetModel();
    if (worksheet.VisitLevel == 3)
        return new V3WorksheetModel();
    return new WorksheetModelBase();
}

这篇关于AutoMapper-类型的条件映射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆