Я хочу нанести 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