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();
4

1 に答える 1

7

ほとんどのマッピング シナリオでは、コンパイル時にマッピング先の型がわかっています。場合によっては、特に動的な型を使用しているシナリオや拡張性のシナリオでは、ソースの型が実行時までわからないことがあります。

DynamicMap 呼び出しは、指定された宛先タイプに渡されるソース オブジェクトのタイプの構成を作成します。2 つの型が既にマップされている場合、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; }
    }

Persons のリストがあるとします。

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 });
}

次に、新しいプロパティを追加する人を選択します。

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(); 
于 2013-02-05T08:02:16.397 に答える