4

親愛なるインターネットコミュニティ。

あるオブジェクトから別のオブジェクトに要素をマップする必要があります。クラスは同一 (同じクラス名、同じプロパティ) であるため、代わりに AutoMapper を試してみるべきだと思います。うまく機能しているように見えますが、問題が発生しました。1 つのクラスに、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 インスタンスを作成する代わりに、プロパティのオブジェクト参照を喜んでコピーします。

Item次のようなカスタム関数に基づいてプロパティを解決するよう AutoMapper に指示する方法を探しています。

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にその単一のプロパティだけの例外を作ってもらいたいです...

4

1 に答える 1

9

MapFromあなたを助けるかもしれません

例えば

 Mapper.CreateMap<LocalService.MyPet, ExternalService.MyPet>()
            .ForMember(dest => dest.MyPet,
                        opt => opt.MapFrom(
                        src => ConvertPet(src.MyPet)));
于 2014-12-08T12:12:59.967 に答える