【问题标题】:Automapper failing to map on IEnumerableAutomapper 无法映射到 IEnumerable
【发布时间】:2011-02-08 08:56:42
【问题描述】:

我有两个这样的课程:

public class SentEmailAttachment : ISentEmailAttachment
{
    public SentEmailAttachment();

    public string FileName { get; set; }
    public string ID { get; set; }
    public string SentEmailID { get; set; }
    public string StorageService { get; set; }
    public string StorageServiceFileID { get; set; }
}

public class SentEmailAttachmentItem : ISentEmailAttachment
{
    [ItemName]
    public string ID { get; set; }
    public string SentEmailID { get; set; }
    public string FileName { get; set; }
    public string StorageService { get; set; }
    public string StorageServiceFileID { get; set; }
}

如您所见,相同(它们都实现了接口以确保这一点)

然后我有以下映射:

Mapper.CreateMap<IEnumerable<SentEmailAttachmentItem>, IEnumerable<SentEmailAttachment>>();
Mapper.CreateMap<IEnumerable<SentEmailAttachment>, IEnumerable<SentEmailAttachmentItem>>();

然后我有以下单元测试:

//create a load of sent email attachments
var listOfSentEmailAttachments = new List<SentEmailAttachment>();

for (int i = 0; i < 10; i++)
    listOfSentEmailAttachments.Add(new SentEmailAttachment { FileName = "testFileName", ID = Guid.NewGuid().ToString(), SentEmailID = Guid.NewGuid().ToString(), StorageService = "S3", StorageServiceFileID = "SomeFileID" });

var sentEmailAttachmentItems = Mapper.DynamicMap<IEnumerable<SentEmailAttachment>, IEnumerable<SentEmailAttachmentItem>>(listOfSentEmailAttachments);

var itemToTest = sentEmailAttachmentItems.First();

Assert.IsInstanceOfType(itemToTest, typeof(SentEmailAttachmentItem));

这失败了 - IEnumerable sentEmailAttachmentItems 为空。 它没有将 SentEmailAttachments 列表映射到它...

知道发生了什么吗??

我让它处理单个对象(将每个对象映射到每个对象),但不是一个集合...

【问题讨论】:

    标签: c# automapper


    【解决方案1】:

    编辑:我找到了一种将 DynamicMap 与集合一起使用的简单方法。

    IEnumerable<FakeItem> unmappedItems = Repository.GetItems();
    IEnumerable<MappedItem> mappedItems = unmappedItems.Select(Mapper.DynamicMap<MappedItem>);
    

    ——原始消息——

    Jimmy 所说的使用它的方式是可行的,但我尽量使用 DynamicMap,以避免为我需要的每个映射都执行“CreateMap”。我认为 DynamicMap 不能很好地处理集合,如果有的话。它不会抛出异常,但结果是一个空集。

    根据过去几天的测试,您目前无法将 DynamicMap 用于集合(据我所知)。

    【讨论】:

      【解决方案2】:

      您不需要显式映射集合类型,只需映射项目类型。做吧:

      Mapper.CreateMap<SentEmailAttachment, SentEmailAttachmentItem>();
      var attachments = Mapper.Map<IEnumerable<SentEmailAttachment>, List<SentEmailAttachmentItem>>(someList);
      

      这样就可以了。

      【讨论】:

      • 我遇到了完全相同的情况,由于某种原因,我的列表在映射后返回为空。我正在映射的 IEnumerable 列表中肯定有项目,但映射后目标列表为空。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-14
      • 1970-01-01
      相关资源
      最近更新 更多