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

5
我有以下代码片段。
var files = query.ToList();
var testFile = Mapper.DynamicMap<EftFileDto>(files.First());
var filesDto = Mapper.DynamicMap<List<EftFileDto>>(files);

testFile 已经映射了正确的值,但是 filesDto 是空的。

看起来 dynamicMap 只适用于单个项目,而不是列表?

files 是一个匿名对象列表。

编辑:如果我使用数组也不行。我可以让它工作,但是……

        var filesDto = query.Select(Mapper.DynamicMap<EftFileDto>).ToList();

也许可以检查一下以下的解决方案:http://stackoverflow.com/a/5978050/1241400 - Matija Grcic
@plurby,那完全不适用,因为那个问题涉及到两种已知类型,而我有一个匿名类型的列表,所以我需要使用DynamicMap而不是Map - CaffGeek
我已经检查过了,当您使用query.Select(Mapper.DynamicMap<EftFileDto>).ToList();语法时它是有效的。您能否提供查询和DTO的代码,以便我们可以帮助您解决问题? - Matija Grcic
1个回答

7
在大多数映射方案中,我们在编译时就知道要映射到的类型。在某些情况下,源类型直到运行时才知道,特别是在使用动态类型或可扩展性方案的情况下。DynamicMap调用为传递给指定目标类型的源对象创建配置。如果已经映射了这两种类型,AutoMapper会跳过此步骤(因为在此示例中我可以多次调用DynamicMap)。
来源: http://lostechies.com/jimmybogard/2009/04/15/automapper-feature-interfaces-and-dynamic-mapping/ 较短版本: DynamicMap与调用CreateMap和Map相同。
一些虚拟的Person类
public class Person
    {
        public string Name { get; set; }
        public string Surname { get; set; }
        public int Age { get; set; }
    }

假设您有一个人员列表。
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 });
}

然后你在persons上进行选择,添加一个新属性。
var anonymousTypes = persons.Select(p => new { 
            p.Name, 
            p.Surname, 
            FullName = String.Format("{0}, {1}", p.Surname,p.Name) }).ToList();

要正确映射第一人称。
var testFile = Mapper.DynamicMap<Person>(anonymousTypes.First()); 

要正确地映射所有人,您将使用:

var testFiles  = anonymousTypes.Select(Mapper.DynamicMap<Person>).ToList(); 

1
你刚才回答了我在编辑中发布的解决方案。问题是我不应该需要使用 .Select 来逐个映射每个项目,而应该能够使用 Mapper.DynamicMap<EftFileDto[]>(files); 将其作为集合进行映射。单个项目可以工作,但列表不行。因此,了解 Dto 的结构不应该有影响,因为单个项目可以正确映射。 - CaffGeek
我知道,我只是提供了一个测试来检查它是否有效。如果您发现有问题,请在项目页面上发布或提交拉取请求。为什么使用Select()会让您感到困扰? - Matija Grcic
1
它看起来很hackish,而我很好奇为什么它不像应该的那样工作。 - CaffGeek
+1 对于 .Select(Mapper.DynamicMap<...>) 部分,那对我很有用。 - Brian MacKay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接