我已经创建了一个用于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);
}
我的方法是否需要进行任何更改?
答案 0 :(得分:0)
由于您要映射到/来自相同类型,因此AutoMapper正在使用其AssignableMapper
,它只是将源对象(NewList
中的项目)的值分配给目标对象(中的一个项目) OldList
)。由于Ac
是引用类型但是按值传递,因此当source设置为destination时,结果永远不会使其返回到目标对象。
AutoMapper在确定是否应使用<SourceType>.IsAssignableFrom(<DestinationType>)
时使用AssignableMapper
,因为它使用的类型相同。 (在确定是否可以使用时,潜在的AutoMapper也应该检查IsValueType
。)
如果没有更多的背景,我会尝试如何让这项工作给你一个想法。您可以定义从现有(AcNew
)继承的新类型(例如Ac
),然后将其用于NewList
或OldList
。例如,您可以将新类型定义为:
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。
此致
罗斯