2014-11-01 155 views
3

我希望能夠映射到IFoo.IBar.Name 而不是創建IBar自己類型的具體對象。 在CreateMap級別使用代理很容易:Mapper.CreateMap<Person, IFoo>(),但是如何實現自定義內部接口類型成員?Automapper - 映射到Interface類型屬性而不創建具體類

public class Test 
{ 
    [Fact] 
    public void MapToInnerInterface() 
    { 
     const int id = 1; 
     const string name = "Peter"; 
     var person = new Person {Id = id, Name = name}; 

     Mapper.CreateMap<Person, IFoo>() 
      .ForMember(dest => dest.Bar.Name, c => c.MapFrom(src => src.Name)); 

     var mapResult = Mapper.Map<IFoo>(person); 

     Assert.Equal(id, mapResult.Id); 
     Assert.Equal(name, mapResult.Bar.Name); 
    } 
} 

public interface IFoo 
{ 
    int Id { get; set; } 
    IBar Bar { get; set; } 
} 

public interface IBar 
{ 
    string Name { get; set; } 
} 

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

回答

0

我希望能夠映射到IFoo.IBar.Name,而無需創建類型伊巴爾的具體對象自己

而且你怎麼能指望AutoMapper知道什麼具體類型用於IBar接口?如你所知,你不能有一個接口的實例。有人必須指定哪種是具體的類型,這絕對不是AutoMapper能夠做到的。

您應該在IBar類型或AfterMap選項上使用自定義解析器,以便指示如何完成此映射。

3

可以通過外部類(Person)映射到所述內部接口(IBar),然後利用在PersonIFoo映射圖做到這一點。

Mapper.CreateMap<Person, IFoo>() 
    .ForMember(dest => dest.Bar, opt => opt.MapFrom(src => src)); 

Mapper.CreateMap<Person, IBar>(); 

IFoo foo = Mapper.Map<IFoo>(person); 

Console.WriteLine(foo.Bar.Name); // Peter 
Console.WriteLine(foo.Id); // 1 

兩個代理對象的創建,一個實施IFoo和其他執行IBar,正如你所期望。

例子:https://dotnetfiddle.net/VuyT1K

+0

這就是答案一直在尋找 - 還不能給予好評。非常感謝。 – asyncpro 2014-11-01 20:44:58

相關問題