AutoMapper - условное сопоставление для типа - PullRequest
2 голосов
/ 17 марта 2012

Я хотел бы сделать что-то вроде следующего, и мне интересно, если кто-то знает, как это сделать:

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, чтобы вернуть правильный класс.)

Спасибо!

1 Ответ

3 голосов
/ 17 марта 2012

Вместо отображения V2WorksheetModel и V3WorksheetModel вы можете сопоставить только базовый класс? Если да, то вы можете использовать ConstructUsing в вашем отображении:

[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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...