AutoMapper .ForMemberの使用方法は?


88

エンティティからDTOに変換するようにAutoMapperを設定しようとしています。.ForMember()後でMapper.CreateMap<Entity, DTO>()カスタムマッピングを設定するために使用することになっていることはわかっていますが、これは利用可能な方法ではないようです。

明確にするために編集:私が読んだドキュメントへのリンク、または基本的な構文の説明を探していません。回答とドキュメントで説明されている正しい構文を使用しています。例:

Mapper.CreateMap<EFAddress, Address>()
      .ForMember(dest => dest.Code, opt => opt.MapFrom(src => src.Name));

CreateMap <>内に無効な型名がある場合、「ForMember」が有効なメソッドとして表示されます。マウスを合わせると、通常予想されるようにメソッドのシグネチャが表示されます。しかし、2つの有効な型を指定するとすぐに、ForMemberは、メソッドが使用できないかのように、シンボルを解決できないと言います。

私が満たしていないジェネリッククラスに何らかの制約がありますか?

ありがとう


2
automapper.codeplex.com/…あなたがやろうとしていることについて、おそらく最良のドキュメントです。CreateMap呼び出しの汎用パラメーターを忘れないでください。
トラビス

2
Mapper.CreateMap<Source, Dest>()以下のすべての回答で参照されている静的メソッドは、現在(2016)廃止されていることに注意してください。
ベン・リプリー

回答:


130

次の構文を試してください。

Mapper
    .CreateMap<Entity, EntityDto>()
    .ForMember(
        dest => dest.SomeDestinationProperty,
        opt => opt.MapFrom(src => src.SomeSourceProperty)
    );

または、ソースプロパティと宛先プロパティの名前が同じである場合:

Mapper.CreateMap<Entity, EntityDto>();

詳細およびその他のマッピングシナリオについては、ドキュメントの関連セクションを確認してください。


1
私の問題は、その文脈で「ForMember」を使用しようとすると、私は単純に取得する「決意のシンボル『ForMemberは』できない」場合と同様にメソッドが存在しないということである
Nellius

@Nelliusは、あなたが示されていない非作業コードを。実例を示しました。ソースと宛先の両方のジェネリッククラスが定義されていること、プロジェクト内でAutoMapperを参照していること、およびドキュメント(および私の回答)に示されている構文が機能することを確認してください。
ダリンディミトロフ2011

4
愚かな質問、optはどういう意味ですか?
riadh gomri 2014年

@riadhgomriオプション/メンバーのオプション
andrewb 2015年

17

結局、これはReSharperとのある種の非互換性であることが判明したと思います。

ReSharperにより、Automapperコードが正しく表示されなかったようですが、正常に機能します(エラーメッセージが表示されて赤で表示されます)。ReSharperをアンインストールすると、この問題は完全に修正されました。


2
ReSharperのどのバージョンですか?AutoMapperのどのバージョンですか?
Colin Pear

1
この問題は、VisualStudio2010のAutoMapperとReSharper8.xに影響すると思います。github.com/ AutoMapper
AutoMapper /

re#8.2でも同じですが、vs 2012では、7.0で問題なく動作しました。
カルロス・ギジェルモBolañosロペス

なぜ51票の回答が選択された回答ではないのですか?ばかげている。
クリスホークス2015

4
それは私が尋ねた質問に答えなかったので。私の質問は、正しい構文を使用し、すべてを正しく参照すると、VisualStudioで認識されないように見えるメソッドについてでした。これは、resharperに関連するバグであることが判明しました。他の答えは私が尋ねたものと非常によく似た質問に答えますが、それは私が実際に尋ねたものに対して完全に間違った答えでした。
ネリウス2015

9

サンプルの実装は次のようになります。

Mapper.CreateMap<Game, GameViewModel>()
  .ForMember(m => m.GameType, opt => opt.MapFrom(src => src.Type))

GameとGameViewModelのプロパティの名前が異なるため、このプロパティをマップする必要があります-それらが同じで同じタイプの場合、ForMemberは必要ありません

ForMemberのもう1つの用途は、マッピングを無視することです。

Mapper.CreateMap<Game, GameViewModel>()
    .ForMember(dest => dest.Prize, opt => opt.Ignore());

1

この使用法と同様に:

  CreateMap<Azmoon, AzmoonViewModel>()
            .ForMember(d => d.CreatorUserName, m => m.MapFrom(s => 
 s.CreatedBy.UserName))
            .ForMember(d => d.LastModifierUserName, m => m.MapFrom(s => 
s.ModifiedBy.UserName)).IgnoreAllNonExisting();

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.