回答:動的マッピングを機能させるにCreateMissingTypeMaps
は、 に設定する必要があります。true
public IEnumerable<T> GetDummies<T>(IEnumerable<dynamic> dummies)
{
var config =
new MapperConfiguration(c => { c.CreateMissingTypeMaps = true; });
IMapper mapper = config.CreateMapper();
return dummies.Select(mapper.Map<T>).ToList();
}
データベースへのクエリを実行するために、Entity Framework のラッパーがあります。ユーザーが必要なプロパティのみを選択できるようにしたいが、エンティティ タイプの結果は保持したい。
これはダミーコードです(EFを使用していませんが、同じ問題があります)
class Program
{
static void Main(string[] args)
{
var dummies = new[]
{
new DummyContainer
{
Name = "First",
Description = "First dummy",
DummyNumbers = new List<int> { 1, 2, 3 },
Foo = new FooThingy { Title = "Foo thingy" }
}
};
var smallDummies = dummies.Select(d => new { d.Name }).ToList();
List<DummyContainer> fullDummies = smallDummies.Select(Mapper.Map<DummyContainer>).ToList();
Debugger.Break();
}
}
class DummyContainer
{
public string Name { get; set; }
public string Description { get; set; }
public ICollection<int> DummyNumbers { get; set; }
public FooThingy Foo { get; set; }
}
class FooThingy
{
public string Title { get; set; }
}
この例外を取得する:
Missing type map configuration or unsupported mapping.
Mapping types:
<>f__AnonymousType0`1 -> DummyContainer
<>f__AnonymousType0`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] -> AutoMapperWithGenerics.DummyContainer
Destination path:
DummyContainer
Source value:
{ Name = First }
ドキュメントには、AutoMapper がプロパティ名を使用してオブジェクトにマップし直すことが記載されているため、ここで少し立ち往生しています: Dynamic and ExpandoObject Mapping。
上記のコードは例であることに注意してください。私のアプリケーションでは、実際にジェネリックを使用しているため、少しおかしくなりました。
Mapper.Map<TEntity>
...そして、このままにしておく必要があります-どのエンティティタイプが使用されているかわかりません。私の期待は次のとおりです。プロパティを既存の型にマップし、欠落している場合は設定しdefault(T)
ます。
編集:マッパーをdynamic
toに指定しようとしましたがT
、ほぼ完全なコードがここにあります:
class Program
{
static void Main(string[] args)
{
// ...
var dumminator = new DummyService();
IEnumerable<DummyContainer> bigDummies = dumminator.GetDummies<DummyContainer>(smallDummies);
Debugger.Break();
}
}
class DummyService
{
public IEnumerable<T> GetDummies<T>(IEnumerable<dynamic> dummies)
{
var config = new MapperConfiguration(c => c.CreateMap<dynamic, T>());
IMapper mapper = config.CreateMapper();
return dummies.Select(mapper.Map<T>).ToList();
}
}
...これは例外で死ぬことはありませんが、結果は必死に空です(すべてのプロパティにdefault
値があります.