@dtryon's answerのオフピギーバック、これについてタフな部分は、あなたのDTOタイプにNameValueCollection
で内部オブジェクトをマッピングする方法はありませんということです。
あなたができることは、NameValueCollection
のアイテムからKeyValuePair<string, string>
オブジェクトを構成するcustom converterオブジェクトを作成することです。これにより、KeyValuePair
から別のマッピングを利用して、目的のタイプの汎用コンバータを作成することができます。ような何か:
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>
との間のマッピングを作成します:
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);
}
}
次にあなたがMetaModel
にKeyValuePair<string, string>
からのマッピングを定義する必要があります
Mapper.CreateMap<NameValueCollection, List<MetaModel>>()
.ConvertUsing<NameValueCollectionConverter<MetaModel>>();
+1、これをカスタムリゾルバでラップして、もう少し再利用できるようにすることができます。 –
あなたはそれをしますか? –