2016-06-14 3 views
0

Я хочу нанести POCO на ImmutableDictionary<string, object>, а Automapper создает исключение, потому что операция Add не поддерживается в ImmutableDictionary.Ошибка сопоставления ImmutableDictionary с AutoMapper

Объект POCO находится в собственности, называемой Data, в исходном типе, который сопоставляется с объектом DataBag в пункте назначения. Тип 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"))); 

Но я все еще получаю ту же ошибку. Во втором случае, это жалобы с этим:

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

Вместо использования ForMember пытаются использовать ConstructUsing так что вы можете дать ему значение для вашего неизменного объекта.

var t = new MapperConfiguration(cfg => 
      cfg.CreateMap(@event.GetType(), typeof(StoredEvent)) 
      .ConstructUsing(x => new ImmutableDictionaryResolver(...))); 
Смежные вопросы