Automapper DynamicMap无法映射匿名类型的列表

Caf*_*eek 5 c# anonymous-types automapper

我有以下代码片段.

var files = query.ToList();
var testFile = Mapper.DynamicMap<EftFileDto>(files.First());
var filesDto = Mapper.DynamicMap<List<EftFileDto>>(files);
Run Code Online (Sandbox Code Playgroud)

testFile 具有正确映射的值,但filesDto为空.

看来dynamicMap适用于单个项目,但不适用于列表?

files 是一个匿名对象列表.

编辑:如果我使用数组也不起作用.我可以让它工作,但......

        var filesDto = query.Select(Mapper.DynamicMap<EftFileDto>).ToList();
Run Code Online (Sandbox Code Playgroud)

Mat*_*cic 7

在大多数映射方案中,我们知道我们在编译时映射到的类型.在某些情况下,直到运行时才知道源类型,尤其是在我使用动态类型或可扩展性场景的情况下.

DynamicMap调用为传入指定目标类型的源对象的类型创建配置.如果已经映射了两种类型,AutoMapper将跳过此步骤(因为我可以为此示例多次调用DynamicMap).

资料来源:http://lostechies.com/jimmybogard/2009/04/15/automapper-feature-interfaces-and-dynamic-mapping/

更短的版本:DynamicMap与调用CreateMap然后调用Map相同.

一些虚拟人类

public class Person
    {
        public string Name { get; set; }
        public string Surname { get; set; }
        public int Age { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

假设你有一份人员名单.

var persons = new List<Person>();
for (int i = 0; i < 100; i++)
{
      persons.Add(new Person { 
                Name = String.Format("John {0}", i), 
                Surname = String.Format("Smith {0}", i), 
                Age = i });
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以选择添加新房产的人员.

var anonymousTypes = persons.Select(p => new { 
            p.Name, 
            p.Surname, 
            FullName = String.Format("{0}, {1}", p.Surname,p.Name) }).ToList();
Run Code Online (Sandbox Code Playgroud)

要正确映射第一个人

var testFile = Mapper.DynamicMap<Person>(anonymousTypes.First()); 
Run Code Online (Sandbox Code Playgroud)

要正确映射您将使用的所有人

var testFiles  = anonymousTypes.Select(Mapper.DynamicMap<Person>).ToList(); 
Run Code Online (Sandbox Code Playgroud)