gpt4 book ai didi

c# - AutoMapper DynamicMap 不工作

转载 作者:太空宇宙 更新时间:2023-11-03 15:25:33 28 4
gpt4 key购买 nike

我已经创建了一个在 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);
}

我的方法是否需要更改?

最佳答案

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

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 .

问候,

罗斯

关于c# - AutoMapper DynamicMap 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35474727/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com