【问题标题】:Use AutoMapper with custom conversion on a specific property使用 AutoMapper 对特定属性进行自定义转换
【发布时间】:2014-12-08 12:02:49
【问题描述】:

亲爱的互联网社区。​​p>

我需要将元素从一个对象映射到另一个对象。这些类是相同的(相同的类名,相同的属性),所以我认为我们应该尝试使用 AutoMapper。它似乎工作得很好,但我遇到了一个障碍:一个类有一个 object 类型属性,用作某种“通配符”容器。

public class MyPet
{
    public int Id { get; set; }
    public object Pet{ get; set; }
}

public class Cat
{

}

public class Dog
{

}

我最初认为 AutoMapper 将能够识别实例的类型并按照指示执行适当的映射:

Mapper.CreateMap<LocalService.MyPet, ExternalService.MyPet>();
Mapper.CreateMap<LocalService.Cat, ExternalService.Cat>();
Mapper.CreateMap<LocalService.Dog, ExternalService.Dog>();


var dtoWithCat0 = new LocalService.MyPet()
{
    Id = 1,
    Item = new LocalService.Cat()
};

var dtoWithDog0 = new LocalService.MyPet()
{
    Id = 2,
    Item = new LocalService.Dog()
};

var dtoWithCat1 = Mapper.Map<ExternalService.MyPet>(dtoWithCat0);

var dtoWithDog1 = Mapper.Map<ExternalService.MyPet>(dtoWithDog0);

Console.WriteLine("{0}: {1} - {2}", dtoWithCat1.GetType().FullName, dtoWithCat1.Id, dtoWithCat1.Item.GetType().FullName);

Console.WriteLine("{0}: {1} - {2}", dtoWithCat1.GetType().FullName, dtoWithDog1.Id, dtoWithDog1.Item.GetType().FullName);

但是,这是输出:

ExternalService.MyPet: 1 - LocalService.Cat
ExternalService.MyPet: 2 - LocalService.Dog

如您所见,AutoMapper 很乐意复制属性 Item 的对象引用,而不是创建新的 ExternalService 实例。

我正在寻找一种方法来指示 AutoMapper 基于自定义函数解析 Item 属性,如下所示:

object ConvertPet(object source)
{
    if (source is LocalService.Cat) return Mapper.Map<ExternalService.Cat>(source as LocalService.Cat);
    if (source is LocalService.Dog) return Mapper.Map<ExternalService.Dog>(source as LocalService.Dog);
}

任何提示将不胜感激!

-S

PS。我注意到存在一个ConvertUsing 方法。不幸的是,这似乎用自定义显式映射替换了 AutoMapper 的“自动”部分,该映射需要实现 DTO 上所有属性的映射。我想偷懒,让 AutoMapper 只为那个单一属性做一个例外......

【问题讨论】:

    标签: list automapper collectionbase


    【解决方案1】:

    可能是MapFrom会帮助你

    举例

     Mapper.CreateMap<LocalService.MyPet, ExternalService.MyPet>()
                .ForMember(dest => dest.MyPet,
                            opt => opt.MapFrom(
                            src => ConvertPet(src.MyPet)));
    

    【讨论】:

    • 谢谢,这正是我要找的东西! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多