2016-06-14 10 views
0

ImmutableDictionaryAddの操作がサポートされていないため、POCOをImmutableDictionary<string, object>にマップし、Automapperが例外を発生させました。ImmutableDictionaryとAutoMapperをマップしようとしてエラーが発生しました

POCOオブジェクトは、宛先のDataBagプロパティにマップされるソースタイプのDataというプロパティにあります。現時点ではDataのタイプは不明です。

私はこのマッピングを使用しています:

var t = new MapperConfiguration(cfg => 
        cfg.CreateMap(@event.GetType(), typeof(StoredEvent)) 
         .ForMember("DataBag", opt => opt.MapFrom("Data"))); 

と、このエラーを取得する:

Mapping types: 
Dictionary`2 -> ImmutableDictionary`2 
System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] -> System.Collections.Immutable.ImmutableDictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] 

Destination path: 
StoredEvent.DataBag.DataBag.DataBag 

これを解決するために、私はカスタムリゾルバを使用してみました:これで

public class ImmutableDictionaryResolver : IValueResolver 
{ 
    public ResolutionResult Resolve(ResolutionResult source) 
    { 
     var dictionary = Mapper.Map<Dictionary<string, object>>(source.Value); 
     return source.New(dictionary.ToImmutableDictionary()); 
    } 
} 

をマッピング:

var t = new MapperConfiguration(cfg => 
      cfg.CreateMap(@event.GetType(), typeof(StoredEvent)) 
      .ForMember(nameof(StoredEvent.DataBag), opt => 
       opt.ResolveUsing<ImmutableDictionaryResolver>().FromMember("Data"))); 

しかし、私はまだ同じエラーが発生しています。これで二例では、その苦情:代わりにForMemberを使用しての

Mapping types: 
ImmutableDictionary`2 -> ImmutableDictionary`2 
System.Collections.Immutable.ImmutableDictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] -> System.Collections.Immutable.ImmutableDictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] 

Destination path: 
StoredEvent.DataBag.DataBag 

答えて

0

ので、あなたがそれをあなたの不変のオブジェクトの値を与えることができConstructUsingを使用するようにしてください。

var t = new MapperConfiguration(cfg => 
      cfg.CreateMap(@event.GetType(), typeof(StoredEvent)) 
      .ConstructUsing(x => new ImmutableDictionaryResolver(...))); 
関連する問題