2016-06-14 16 views
0

Ich möchte ein POCO in eine ImmutableDictionary<string, object> abbilden, und Automapper löst eine Ausnahme aus, da die Operation Add in ImmutableDictionary nicht unterstützt wird.Fehler beim Zuordnen von ImmutableDictionary mit AutoMapper

Das POCO-Objekt befindet sich in der Eigenschaft Data im Quelltyp, die der Eigenschaft DataBag im Ziel zugeordnet wird. Der Typ der Data ist zu diesem Zeitpunkt nicht bekannt.

Ich verwende diese Zuordnung:

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

und immer diese Fehlermeldung:

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 

Um dies zu lösen, habe ich versucht, einen benutzerdefinierten Resolver zu verwenden:

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

Mit diesem Zuordnung:

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

Aber ich bekomme immer noch den gleichen Fehler. Im zweiten Fall, es Beschwerden mit diesem:

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 

Antwort

0

Statt ForMember der Verwendung versuchen ConstructUsing zu verwenden, so können Sie ihm einen Wert für Ihr unveränderliches Objekt geben.

var t = new MapperConfiguration(cfg => 
      cfg.CreateMap(@event.GetType(), typeof(StoredEvent)) 
      .ConstructUsing(x => new ImmutableDictionaryResolver(...))); 
Verwandte Themen