web-dev-qa-db-ja.com

オートマッパーがIEnumerableでマップに失敗する

次のような2つのクラスがあります。

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のリストをマップしませんでした...

何が起こっているのでしょうか??

私はそれを単一のオブジェクトで動作させています(それぞれをそれぞれにマッピングしています)が、コレクションではありません...

47
Alex

コレクションタイプを明示的にマップする必要はなく、アイテムタイプのみをマップする必要があります。ただやる:

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

それはうまく動作します。

109
Jimmy Bogard

[〜#〜] edit [〜#〜]:コレクションでDynamicMapを使用する簡単な方法を見つけました。

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

- オリジナルメッセージ -

Jimmyの使用方法は機能しますが、必要なすべてのマッピングに対して「CreateMap」を実行する必要がないようにできる場合は、DynamicMapを使用しようとします。 DynamicMapがコレクションとうまく機能するとは思えません。例外はスローされませんが、結果は空のセットです。

過去数日間のテストから、現時点ではコレクションにDynamicMapを使用できません(私が知っていることです)。

11
blockloop