Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自动映射忽略BeforeMap_C#_Automapper - Fatal编程技术网

C# 自动映射忽略BeforeMap

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

我想映射一个外部API的响应,它类似于下面的代码

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为什么不起作用的帖子。谢谢你的帮助!!!