我最近从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