2016-02-03 24 views
1

我試圖映射類似下面的內容。使用派生類型從基本列表映射到另一個基本列表

public abstract class AnimalBLO { } 

public abstract class AnimalDLO { } 

public class HumanBLO : AnimalBLO { } 

public class HumanDLO : AnimalDLO { } 

public class LionBLO : AnimalBLO { } 

public class LionDLO : AnimalDLO { } 

internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     Mapper.CreateMap<HumanDLO, HumanBLO>(); 
     Mapper.CreateMap<LionDLO, LionBLO>(); 

     var dlos = new List<AnimalDLO>() 
     { 
      new HumanDLO(), 
      new LionDLO() 
     }; 

     var result = Mapper.Map<List<AnimalBLO>>(dlos); 

    } 
} 

其中列表的基本類型是AnimalBLO,但它們映射爲派生類型。有沒有辦法做到這一點,而不是把所有的東西都扔出去,然後把它們結合在一起?

我想這個代碼將工作:

 Mapper.CreateMap<AnimalDLO, AnimalBLO>() 
      .Include<HumanDLO, HumanBLO>() 
      .Include<LionDLO, LionBLO>(); 

     Mapper.CreateMap<HumanDLO, HumanBLO>(); 
     Mapper.CreateMap<LionDLO, LionBLO>(); 

但是,下面的異常消息拋出:

{ 「抽象類的實例不能被創建。」}

回答

0

版本4.2(可能5.X)解決方案會是什麼樣子:

var config = new MapperConfiguration(cfg => 
{ 

    cfg.CreateMap<AnimalDLO, AnimalBLO>() 
     .Include<HumanDLO, HumanBLO>() 
     .Include<LionDLO, LionBLO>(); 

    cfg.CreateMap<HumanDLO, HumanBLO>(); 
    cfg.CreateMap<LionDLO, LionBLO>(); 
}); 

var dlos = new List<AnimalDLO> 
{ 
    new LionDLO(), 
    new HumanDLO(), 
}; 

var result = config.CreateMapper().Map<List<AnimalBLO>>(dlos); 
1

AutoMapper的Mapping inheritance功能正如您所描述的那樣工作。我已經添加Tag屬性類,以驗證該地圖被稱爲:

public abstract class AnimalBLO 
{ 
    public string Tag { get; set; } 
} 

這裏是成功的測試:

[SetUp] 
public void SetUp() 
{ 
    Mapper.Initialize(cfg => { 
     cfg.CreateMap<AnimalDLO, AnimalBLO>() 
       .Include<HumanDLO, HumanBLO>() 
       .Include<LionDLO, LionBLO>(); 
     cfg.CreateMap<HumanDLO, HumanBLO>().AfterMap((src, dest) => dest.Tag = "mapped as Human"); 
     cfg.CreateMap<LionDLO, LionBLO>(); 
    }); 
} 

[Test] 
public void Test() 
{ 
    var dlos = new List<AnimalDLO> 
    { 
     new HumanDLO(), 
     new LionDLO() 
    }; 

    var result = Mapper.Map<List<AnimalBLO>>(dlos); 
    var human = result.First(); 

    Assert.IsInstanceOf(typeof(HumanBLO), human); 
    Assert.AreEqual("mapped as Human", human.Tag); 
} 
+0

這看起來確實是我想要的,我今晚會測試它,很可能接受!謝謝。 –

+0

這看起來像適用於較舊版本的AutoMapper(如果任何人對於過時的警告都可以,那麼當前版本可以)。 –

相關問題