В ответ на @ dtryon's answer сложная часть этого заключается в том, что невозможно сопоставить внутренние объекты в NameValueCollection
с вашим типом DTO.
Одна вещь, которую вы могли бы сделать, - написать пользовательский конвертер , который создает KeyValuePair<string, string>
объекты из элементов NameValueCollection
. Это позволит вам создать универсальный конвертер, который использует другое сопоставление от KeyValuePair
до выбранного вами типа назначения. Что-то вроде:
public class NameValueCollectionConverter<T> : ITypeConverter<NameValueCollection, List<T>>
{
public List<T> Convert(ResolutionContext ctx)
{
NameValueCollection source = ctx.SourceValue as NameValueCollection;
return source.Cast<string>()
.Select (v => MapKeyValuePair(new KeyValuePair<string, string>(v, source[v])))
.ToList();
}
private T MapKeyValuePair(KeyValuePair<string, string> source)
{
return Mapper.Map<KeyValuePair<string, string>, T>(source);
}
}
Тогда вам необходимо определить отображение от KeyValuePair<string, string>
до MetaModel
:
Mapper.CreateMap<KeyValuePair<string, string>, MetaModel>()
.ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Key))
.ForMember(dest => dest.Value, opt => opt.MapFrom(src => src.Value));
И, наконец, создайте отображение между NameValueCollection
и List<MetaModel>
, используя пользовательский конвертер:
Mapper.CreateMap<NameValueCollection, List<MetaModel>>()
.ConvertUsing<NameValueCollectionConverter<MetaModel>>();