AutoMapper DynamicMap无法正常工作

时间:2016-02-18 06:52:01

标签: c# automapper

我已经创建了一个用于List之间映射的通用方法。 它工作得很好,直到AutoMapper版本3.3.1。 版本4.0.0之后它无法正常工作

public class Helper<T> : List<T> where T : new()
{
    public void MapBetween(List<T> NewList, List<T> OldList)
    {
        try
        {
            foreach (var NewItem in NewList)
            {
                string PrimaryKey = NewItem.GetType().GetProperties().First(f => f.Name.ToLower() == typeof(T).Name.ToLower() + "id").GetValue(NewItem).ToString();
                var OldItem = OldList.Find(delegate(T p) { return p.GetType().GetProperties()[0].GetValue(p).Equals(PrimaryKey); });
                AutoMapper.Mapper.DynamicMap(NewItem, OldItem);//Mapping
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}

public class Ac
{
    public string AcId { get; set; }
    public string A { get; set; }
    public string B { get; set; }
}

public void ConvertList()
{
        List<Ac> OldList = new List<Ac>();
        OldList.Add(new Ac { AcId = "1", A = "Old A", B = "Old B" });

        List<Ac> NewList = new List<Ac>();
        NewList.Add(new Ac { AcId = "1", A = "new A", B = "new B" });

        Helper<Ac> helper = new Helper<Ac>();
        helper.MapBetween(NewList, OldList);
}

我的方法是否需要进行任何更改?

1 个答案:

答案 0 :(得分:0)

由于您要映射到/来自相同类型,因此AutoMapper正在使用其AssignableMapper,它只是将源对象(NewList中的项目)的值分配给目标对象(中的一个项目) OldList)。由于Ac是引用类型但是按值传递,因此当source设置为destination时,结果永远不会使其返回到目标对象。

AutoMapper在确定是否应使用<SourceType>.IsAssignableFrom(<DestinationType>)时使用AssignableMapper,因为它使用的类型相同。 (在确定是否可以使用时,潜在的AutoMapper也应该检查IsValueType。)

如果没有更多的背景,我会尝试如何让这项工作给你一个想法。您可以定义从现有(AcNew)继承的新类型(例如Ac),然后将其用于NewListOldList。例如,您可以将新类型定义为:

public class AcNew : Ac {}

ConvertList()中,您将使用:

List<AcNew> NewList = new List<AcNew>();
NewList.Add(new AcNew { AcId = "1", A = "new A", B = "new B" });

当您这样做时,AutoMapper将不再使用AssignableMapper,因为作业分配为not possible between base & derived types

此致

罗斯