我想知道如何自动映射这个或者它是否可以完成(我想不是,但我只是想检查)。
我有类似的东西
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。我想知道我怎么能这样做呢?
// controller
List<ReminderTypes> types = Service.GetReminderTypes();
List<RemindersViewModel> viewModel = new List<RemindersViewModel>();
RemindersViewModel map = Mapper.Map<List<ReminderTypes>, List<SelectListItem>>(types);
所以现在我已经映射了selectlistitems。现在我想向viewModel添加“map”。我希望将相同的“地图”添加到viewModel中5次。
是否有可能以某种方式使用automapper来说这个“地图”并将其映射到我的viewModel 5次?
或者我是否必须使用for循环?
for(int i =0; i < 5; i++)
{
viewModel.Add(map);
}
就像我说的那样我认为不可能,但我很好奇,因为我没有长时间使用atuomapper。
答案 0 :(得分: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
的值。
我在AutoMapper周围的包装器(“MappingService”)中执行此操作。
以下是其中的一部分:
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")) %>
第二个问题: 是否有可能以某种方式使用automapper来说这个“地图”并将其映射到我的viewModel 5次?
据我所知,这是不可能的。但是,如果有办法,请告诉我。