在automapper中,我如何将namevalue集合映射到强类型集合?
Mapper.Map<NameValueCollection, List<MetaModel>>();
public class MetaModel
{
public string Name;
public string Value;
}
答案 0 :(得分:4)
关于@dtryon's answer的背驮式,关于这一点的难点在于,无法将NameValueCollection
中的内部对象映射到DTO类型。
你可以做的一件事就是写一个custom converter来构造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>>();
答案 1 :(得分:2)
好吧,因为NameValueCollection是如此特殊,我认为没有一个好方法可以做到这一点。这主要是因为您无法获取NameValueCollection中的键/值对象的句柄。幸运的是,映射到List<MetaModel>
的代码并不是那么糟糕。我只是手动映射它并继续工作:
[TestMethod]
public void TestMethod2()
{
List<MetaModel> dest = new List<MetaModel>();
NameValueCollection src = new NameValueCollection();
src.Add("Key1", "Value1");
src.Add("Key2", "Value2");
src.Add("Key3", "Value3");
src.Add("Key4", "Value4");
src.Add("Key5", "Value5");
foreach (var srcItem in src.AllKeys)
{
dest.Add(new MetaModel() { Name = srcItem, Value = src[srcItem] });
}
Assert.AreEqual(5, dest.Count);
}