C# 自动映射忽略BeforeMap
我想映射一个外部API的响应,它类似于下面的代码C# 自动映射忽略BeforeMap,c#,automapper,C#,Automapper,我想映射一个外部API的响应,它类似于下面的代码 public class ListOfPersons { public IEnumerable<Person> Persons { get; set; } public class Person { public string Name { get; set; } } } 我有以下自动映射分析器 CreateMap<Person, MyPersonObject>(); Creat
public class ListOfPersons
{
public IEnumerable<Person> Persons { get; set; }
public class Person {
public string Name { get; set; }
}
}
我有以下自动映射分析器
CreateMap<Person, MyPersonObject>();
CreateMap<ListOfPersons, IEnumerable<MyPersonObject>>()
.BeforeMap((src, dest) =>
{
src.Data = src.Data.Take(24).ToList();
})
.ConvertUsing<GenericListOfPersonsConverter>();
class DataPointConverter : ITypeConverter<ListOfPerson, IEnumerable<MyPersonObject>>
{
public IEnumerable<MyPersonObject> Convert(ListOfPersons source,
IEnumerable<MyPersonObject> destination, ResolutionContext context)
{
return source.Persons.Select(Mapper.Map<MyPersonObject>);
}
}
CreateMap();
CreateMap()
.BeforeMap((src,dest)=>
{
src.Data=src.Data.Take(24.ToList();
})
.ConvertUsing();
类DataPointConverter:ITypeConverter
{
公共IEnumerable转换(ListOfPersons源、,
IEnumerable destination,ResolutionContext(上下文)
{
返回source.Persons.Select(Mapper.Map);
}
}
正如您在代码中看到的,我只想得到24个第一人称,但是当我执行映射时
var mapperObject = Mapper.Map<IEnumerable<MyPersonObject>(source);
var-mapperObject=Mapper.MapBeforeMap不为类型转换器调用。在转换器内编写事件代码。类型转换器不调用BeforeMap。在转换器内编写事件代码。我认为有两个问题。第一:您不应该映射到IEnumerable,因为映射程序已经知道如何映射到Enumerable:)。您可以创建一个新的列表对象(MyPersonObjectList)。第二个问题:有没有可能更换转换器,让24个人去那里
public class GenericListOfPersonsConverter : ITypeConverter<ListOfPersons, MyPersonObjectList>
{
public MyPersonObjectList Convert(ListOfPersons source, MyPersonObjectList destination, ResolutionContext context)
{
//Take 24 persons here
return new MyPersonObjectList(){MyPersonObjects = source.Persons.Take(24).Select(p => p.Name).ToList()};
}
}
public class MyPersonObjectList
{
public List<string> MyPersonObjects {get; set;}
public MyPersonObjectList() {
MyPersonObjects = new List<string>();
}
}
公共类GenericListOfPersonConverter:ITypeConverter
{
公共MyPersonObjectList转换(ListOfPerson源、MyPersonObjectList目标、ResolutionContext上下文)
{
//这里有24个人
返回新的MyPersonObjectList(){MyPersonObjects=source.Persons.Take(24).Select(p=>p.Name).ToList();
}
}
公共类MyPersonObject列表
{
公共列表MyPersonObject{get;set;}
公共MyPersonObject列表(){
MyPersonObjects=新列表();
}
}
我认为有两个问题。第一:您不应该映射到IEnumerable,因为映射程序已经知道如何映射到Enumerable:)。您可以创建一个新的列表对象(MyPersonObjectList)。第二个问题:有没有可能更换转换器,让24个人去那里
public class GenericListOfPersonsConverter : ITypeConverter<ListOfPersons, MyPersonObjectList>
{
public MyPersonObjectList Convert(ListOfPersons source, MyPersonObjectList destination, ResolutionContext context)
{
//Take 24 persons here
return new MyPersonObjectList(){MyPersonObjects = source.Persons.Take(24).Select(p => p.Name).ToList()};
}
}
public class MyPersonObjectList
{
public List<string> MyPersonObjects {get; set;}
public MyPersonObjectList() {
MyPersonObjects = new List<string>();
}
}
公共类GenericListOfPersonConverter:ITypeConverter
{
公共MyPersonObjectList转换(ListOfPerson源、MyPersonObjectList目标、ResolutionContext上下文)
{
//这里有24个人
返回新的MyPersonObjectList(){MyPersonObjects=source.Persons.Take(24).Select(p=>p.Name).ToList();
}
}
公共类MyPersonObject列表
{
公共列表MyPersonObject{get;set;}
公共MyPersonObject列表(){
MyPersonObjects=新列表();
}
}
我不知道您真正的代码是什么样子,但这段代码没有多大意义。AM默认处理集合。@LucianBargaoanu我尝试过开箱即用,但它不起作用。我知道源数据很少,但我无法更改它。我不知道您的真实代码是什么样子,但这段代码没有多大意义。AM默认处理集合。@LucianBargaoanu我尝试过开箱即用,但它不起作用。我知道源数据很少,但我无法更改它。我尝试过这个方法,但不起作用。考虑到我正在尝试在同一映射中使用BerforeMap和ConvertUsing。即使我在beforeMap代码中添加了一个断点,但它仍然没有被执行。我猜这就是@LucianBargaoanu所说的,BeforeMap不是为类型转换调用的。我已经更改了我的解决方案,请检查一下,可能会有帮助!这是我最后完成的解决方案,但出于好奇,我发布了BeforeMap为什么不起作用的帖子。谢谢你的帮助!!!我试过了,但没用。考虑到我正在尝试在同一映射中使用BerforeMap和ConvertUsing。即使我在beforeMap代码中添加了一个断点,但它仍然没有被执行。我猜这就是@LucianBargaoanu所说的,BeforeMap不是为类型转换调用的。我已经更改了我的解决方案,请检查一下,可能会有帮助!这是我最后完成的解决方案,但出于好奇,我发布了BeforeMap为什么不起作用的帖子。谢谢你的帮助!!!