AutoMapper .ForMember를 사용하는 방법?


88

Entity에서 DTO로 변환하도록 AutoMapper를 설정하려고합니다. 사용자 지정 매핑을 설정하기 위해 .ForMember()after 를 사용해야한다는 것을 알고 Mapper.CreateMap<Entity, DTO>()있지만 이것은 사용 가능한 방법이 아닌 것 같습니다.

설명 편집 : 내가 읽은 문서에 대한 링크 나 기본 구문에 대한 설명을 찾고 있지 않습니다. 답변 및 설명서에 설명 된대로 올바른 구문을 사용하고 있습니다. 예를 들면 다음과 같습니다.

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

CreateMap <> 내에 잘못된 형식 이름이있는 경우 "ForMember"를 유효한 메서드로 볼 수 있습니다. 마우스를 올리면 일반적으로 예상하는 메서드 서명이 표시됩니다. 그러나 두 가지 유효한 유형을 제공하자마자 ForMember는 메서드를 사용할 수없는 것처럼 기호를 확인할 수 없다고 말합니다.

내가 만나지 않는 제네릭 클래스에 어떤 종류의 제약이 있습니까?

감사


2
automapper.codeplex.com/… 수행하려는 작업에 대한 최고의 문서 일 것입니다. CreateMap 호출에서 일반 매개 변수를 잊지 마십시오.
Travis

2
Mapper.CreateMap<Source, Dest>()아래의 모든 답변에서 참조 된 정적 메서드는 이제 (2016) 사용되지 않는 것으로 표시 됩니다.
Ben Ripley

답변:


132

다음 구문을 시도하십시오.

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

또는 소스 및 대상 속성의 이름이 단순히 동일한 경우 :

Mapper.CreateMap<Entity, EntityDto>();

자세한 내용 및 기타 매핑 시나리오 는 설명서 의 관련 섹션을 확인하십시오 .


1
내 문제는 해당 컨텍스트에서 "ForMember"를 사용하려고 할 때 메서드가 존재하지 않는 것처럼 단순히 "Cannot resolve symbol 'ForMember'"라는 메시지가 표시
된다는 것입니다

@Nellius, 작동하지 않는 코드를 표시하지 않았습니다 . 나는 실제적인 예를 보여 주었다. 소스 및 대상 일반 클래스가 모두 정의되어 있는지, 프로젝트 내에서 AutoMapper를 참조했는지 확인하고 문서 (및 내 대답)에 표시된 구문이 작동하는지 확인하십시오.
Darin Dimitrov

4
어리석은 질문입니다. opt가 무엇을 의미합니까?
riadh gomri

@riadhgomri 옵션 / 회원에 대한 옵션
andrewb

17

결국 저는 이것이 ReSharper와 일종의 비 호환성으로 판명되었다고 생각합니다.

ReSharper로 인해 Automapper 코드가 잘못 표시되는 것 같지만 정상적으로 작동합니다 (오류 메시지와 함께 빨간색으로 표시 되더라도). ReSharper를 제거하면이 문제가 완전히 해결되었습니다.


2
ReSharper의 버전은 무엇입니까? AutoMapper의 버전은 무엇입니까?
Colin Pear

1
이 문제가 VisualStudio 2010의 AutoMapper 및 ReSharper 8.x에 영향을 미친다고 생각합니다. github.com/AutoMapper/AutoMapper/issues/381
dthrasher

re # 8.2에서는 동일하지만 2012와 비교하면 7.0에서는 잘 작동했습니다.
Carlos Guillermo Bolaños Lopez

51 개의 찬성표를 가진 답변이 선택된 답변이 아닌 이유는 무엇입니까? 어리석은.
Chris Hawkes 2015

4
내가 묻는 질문에 대한 답이 아니기 때문입니다. 내 질문은 올바른 구문을 사용하고 모든 것을 올바르게 참조 할 때 Visual Studio에서 인식되지 않는 방법에 관한 것이 었습니다. 이것은 resharper와 관련된 버그로 밝혀졌습니다. 다른 답변은 제가 요청한 질문과 매우 유사한 질문에 대한 답변을 제공하지만 실제로 요청한 답변에는 완전히 잘못된 답변이었습니다.
Nellius

9

샘플 구현은 다음과 같습니다.

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

Game과 GameViewModel의 속성 이름이 다르기 때문에이 속성을 매핑해야합니다. 동일하고 유형이 같으면 ForMember가 필요하지 않습니다.

ForMember의 또 다른 용도는 매핑을 무시하는 것입니다.

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.