2

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);

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.)

Thanks!

diegohb
  • 1,857
  • 2
  • 16
  • 34

1 Answers1

3

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();
}
wal
  • 17,409
  • 8
  • 74
  • 109
  • I ended up using a two converters that derived from a base converter class that took a type reference to the destination worksheet type. However, Ill need to look into using the ConstructUsing(). My main issue was trying to honor DRY, my solution was one way to do that, but yours is even better. thanks! – diegohb Mar 17 '12 at 21:35