1

回答:動的マッピングを機能させるに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)ます。


編集:マッパーをdynamictoに指定しようとしましたが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値があります.

4

3 に答える 3

4

非推奨の代わりに、DynamicMapグローバルに構成できます。

var config = new MapperConfiguration(cfg => cfg.CreateMissingTypeMaps = true);

ウィキ参照。

于 2016-04-20T14:40:38.830 に答える
1

動的クラスまたは匿名クラスからマップするMapper.DynamicMap<T>代わりに使用する必要がありますMapper.Map<T>

List<DummyContainer> fullDummies = smallDummies.Select(Mapper.DynamicMap<DummyContainer>).ToList();
于 2016-04-20T13:57:37.410 に答える