Может ли авто картограф сделать это? - PullRequest
1 голос
/ 06 февраля 2011

Мне интересно, как я могу автоматически сопоставить это или вообще это можно сделать (я думаю, что нет, но я просто хотел проверить).

У меня есть что-то вроде этого

public class RemindersViewModel()
{
   public List<SelectListItem> Reminder { get; set; }
   public ReminderTypes SelectedReminder { get; set; }
}

Сначала мне нужно заполнить SelectListItems

Mapper.CreateMap<ReminderTypes, SelectListItem>().ForMember(dest => dest.Text,
                                           opt =>opt.MapFrom(src => src.ReminderTypes))
             .ForMember(dest => dest.Value, opt => opt.MapFrom(src => src.ReminderTypes));

Я также хочу отметить, что ReminderTypes - это перечисление. Мне интересно, так что кажется, я не могу сделать src.ReminderTypes. Мне интересно, как я могу это сделать?

// контроллер

  List<ReminderTypes> types = Service.GetReminderTypes();
  List<RemindersViewModel> viewModel = new List<RemindersViewModel>();
  RemindersViewModel map = Mapper.Map<List<ReminderTypes>, List<SelectListItem>>(types);

Так что теперь у меня есть сопоставленные элементы списка выбора. Теперь я хочу добавить «карту» в viewModel. Я хочу, чтобы одна и та же "карта" была добавлена ​​в viewModel 5 раз.

Можно ли каким-то образом использовать autopper, чтобы сказать: возьми эту "карту" и сопоставь ее 5 раз с моей viewModel?

Или я должен использовать цикл for?

for(int i =0; i < 5; i++)
{
   viewModel.Add(map);
}

Как я уже сказал, я не думаю, что это возможно, но мне любопытно узнать, так как я давно не использую atuomapper.

1 Ответ

1 голос
/ 06 февраля 2011

На ваш 1-й вопрос: Я также хочу указать, что ReminderTypes - это перечисление. Мне интересно, так что кажется, я не могу сделать src.ReminderTypes. Мне интересно, как я могу это сделать?

CreateMap<ReminderType, SelectListItem>()
    .ForMember(d => d.Text, o => o.MapFrom(x => x))
    .ForMember(d => d.Value, o => o.MapFrom(x => (int) x));

Затем вы должны пройти через каждый ReminderType и установить значение для SelectListItem. Я делаю это в оболочке ("MappingService") вокруг AutoMapper.

Вот часть этого:

public object Map(object source, Type sourceType, Type destinationType)
{
    if (source is IEnumerable)
    {
        IEnumerable<object> input = ((IEnumerable)source).OfType<object>();
        Array a = Array.CreateInstance(destinationType.GetElementType(), input.Count());

        int index = 0;
        foreach (object data in input)
        {
            a.SetValue(AutoMap(data, data.GetType(), destinationType.GetElementType()), index);
            index++;
        }
        return a;
    }

    return AutoMap(source, sourceType, destinationType);
}

AutoMap является открытым статическим делегатом для реальной реализации Mapper.Map. Обратите внимание, что этот код работает только с массивами!

В вашем контроллере вы можете написать:

public ActionResult Reminders()
{
    ReminderService reminderService = new ReminderService();
    ReminderType[] reminderTypes = reminderService.GetReminderTypes();
    SelectListItem[] selectListItems = _mappingService.Map(reminderTypes, reminderTypes.GetType(), typeof(SelectListItem[])) as SelectListItem[];

    RemindersViewModel remindersViewModel = new RemindersViewModel
                                                {
                                                    Reminder = selectListItems,
                                                    SelectedReminder = ReminderType.CReminder
                                                };

    return View(remindersViewModel);

}

Вид:

<% =Html.DropDownListFor(x => x.SelectedReminder, new SelectList(Model.Reminder, "Value", "Text")) %>

2-й вопрос: Можно ли как-то использовать autopper, чтобы сказать: возьми эту "карту" и сопоставь ее 5 раз с моей viewModel?

Насколько я знаю, это невозможно. Но дайте мне знать, если есть способ сделать это.

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