На ваш 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?
Насколько я знаю, это невозможно. Но дайте мне знать, если есть способ сделать это.