我最近從AutoMapper 2.2.0升級到2.2.1,並且我停止了正確的映射。下面是該方法的僞版本:AutoMapper 2.2.1 DynamicMap未映射底層類型屬性(2.2.0)
public void LoadModel<TModel>(int id, TModel model) where TModel : ModelBase
{
var entity = _repo.LoadById(id);
_mapper.DynamicMap(entity, model);
model.AfterMap(); // AfterMap is a virtual method in ModelBase
}
ModelBase
由被傳遞到該方法的父類的實例繼承抽象類。在版本2.2.0中,來自entity
實例的相應屬性已正確映射到model
實例的ModelBase
屬性;升級到版本2.2.1後,ModelBase
上的屬性不再映射 - 沒有拋出異常,但屬性根本沒有設置。
更新: 下面是一個具體的例子,說明2.2.0和2.2.1之間的區別。在2.2.0版本中,輸出將是:
Male
True
在2.2.1版本的輸出將是:
Male
False
在Human
的IsEmployed
屬性不被映射在2.2.1版本,但在版本2.2.0中。下面是示例代碼:
namespace TestAutomapper
{
using System;
class Program
{
static void Main(string[] args)
{
Tester tester = new Tester();
tester.Test();
}
}
public class Tester
{
public void Test()
{
var animal = (Animal)new Human();
LoadModel(animal);
var human = (Human)animal;
Console.WriteLine(human.Gender);
Console.WriteLine(human.IsEmployed.ToString());
Console.ReadLine();
}
private void LoadModel<TModel>(TModel model) where TModel : Animal
{
var tim = new Developer { Gender = "Male", IsEmployed = true, KnownLanguages = 42 };
AutoMapper.Mapper.DynamicMap(tim, model);
}
}
public abstract class Animal
{
public string Gender { get; set; }
}
public class Human : Animal
{
public bool IsEmployed { get; set; }
}
public class Developer
{
public string Gender { get; set; }
public bool IsEmployed { get; set; }
public int KnownLanguages { get; set; }
}
}
這個問題似乎涉及到的Human
拳擊作爲Animal
之前得到映射。我並不是說這是一個錯誤,但它在版本之間的表現會有所不同。
更新2:在我的例子中的抽象類是一個紅色的鯡魚;如果我使用名爲IAnimal
的接口而不是名爲Animal
的抽象類,則該示例適用。這個問題似乎清楚地表明,動態映射時,版本2.2.0考慮基礎類型,而版本2.2.1則不考慮。
您能否展示一個突出顯示問題的完整代碼示例? – PatrickSteele 2013-03-26 18:28:01
當然。讓我解決這個問題,然後編輯我的問題。 – 2013-03-27 12:48:47