32

これが私のコードです:

Mapper.CreateMap<Foo, Foo2>()
   .ForMember(dest => dest.Bar, opt => opt.MapFrom(src => src.Bar == null ? new BarViewModel() : src.Bar))

基本的に、「BarViewModel」には、クラスにプロパティを設定するパラメーターなしの ctor があります。

だから私はAutoMapperに言いたい:

値が null の場合は、クラスに ctor を使用します。それ以外の場合は、適切なマッピングを使用してください

上記は私にC#コンパイラエラーを与えています。そして、キャストもうまくいかないと思います。

これを行うための AutoMapper トリックはありますか?

最悪の場合、そのプロパティのマッピングを削除して、次のことを行うだけです。

var mapped = Mapper.Map<Foo,Foo2>(src);
if (mapped.Bar == null) mapped.Bar = new BarViewModel();

しかし、それは少し醜いです。

アイデア?

4

5 に答える 5

36

カスタム値リゾルバーを使用できます。以下が機能するはずです。

Mapper.CreateMap<Foo, Foo2>()
   .ForMember(dest => dest.Bar, opt => opt.ResolveUsing(src => src.Bar == null ? new Bar() : Mapper.Map<Bar,Bar2>(src.Bar)))
于 2012-07-19T07:31:14.500 に答える
9

.NullSubstitute()Automapper で NULL 値をカスタム値に置き換えるために使用できるようになりました。

CreateMap<SMModel, VM_SMModel>()
                    .ForMember(d => d.myDate, o => o.NullSubstitute(new DateTime(2017,12,12)));
于 2016-09-20T19:42:06.097 に答える
3

次の場合、コンパイラ エラーは発生しません。

public class Foo
{
    public Bar Bar { get; set; }
}

public class Foo2
{
    public Bar Bar { get; set; }
}

public class Bar
{
    public int Id { get; set; }

    public Bar()
    {
        Id = 3;
    }
}

CreateMap<Foo, Foo2>()
    .ForMember(
        dest => dest.Bar,
        opt => opt.MapFrom(src => src.Bar == null ? new Bar() : src.Bar));

...だから、問題が実際にマッピングにないのではないかと思っていますか?

于 2012-07-19T08:31:29.637 に答える