Automapper - конвертировать NameValueCollection в строго типизированную коллекцию - PullRequest
4 голосов
/ 20 февраля 2012

Как я могу сопоставить коллекцию namevalue в строго типизированную коллекцию в automapper?

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

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

Ответы [ 2 ]

4 голосов
/ 21 февраля 2012

В ответ на @ 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>>();
2 голосов
/ 20 февраля 2012

Ну, поскольку 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);

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...