Automapper忽略BeforeMap

时间:2017-10-31 14:37:30

标签: c# automapper

我想映射外部API的响应,类似于以下代码

public class ListOfPersons
{
    public IEnumerable<Person> Persons { get; set; }

    public class Person {
        public string Name { get; set; }
    }
}

我想映射到MyPersonObject的IEnumerable

public MyPersonObject 
{
    public string Name { get; set; }
}

我有以下Automapper Profiler

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>);
        }
    }

正如您在代码中看到的那样,我希望只获得24个第一人,但是当我执行映射时

var mapperObject = Mapper.Map<IEnumerable<MyPersonObject>(source);

mappedObject包含超过24个元素,从不执行beforeMap。任何想法,因为beforeMap被忽略了?

谢谢!

2 个答案:

答案 0 :(得分:2)

不为类型转换器调用BeforeMap。在转换器中写下事件代码。

答案 1 :(得分:2)

我认为有两个问题。第一个:你不应该映射到IEnumerable,因为mapper已经知道如何映射到Enumerable :)。您可以创建一个新的列表对象(MyPersonObjectList)。第二个:是否有可能改变转换器并在那里得到24个人?

cross-env BABEL_DISABLE_CACHE=1 NODE_ENV=test node --harmony_proxies node_modules/.bin/jest .