Automapper - 将NameValueCollection转换为强类型集合

时间:2012-02-20 07:20:20

标签: automapper

在automapper中,我如何将namevalue集合映射到强类型集合?

Mapper.Map<NameValueCollection, List<MetaModel>>();

public class MetaModel
{
     public string Name;
     public string Value;
}

2 个答案:

答案 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));

最后,使用自定义转换器在NameValueCollectionList<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);

    }