在 automapper 中,如何将名称值集合映射到强类型集合?

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

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

最佳答案

捎带 @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>>();

关于Automapper - 将 NameValueCollection 转换为强类型集合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9357497/

10-10 19:31