自动映射器可以这样做吗?

时间:2011-02-05 21:18:22

标签: c# asp.net-mvc automapper

我想知道如何自动映射这个或者它是否可以完成(我想不是,但我只是想检查)。

我有类似的东西

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。

1 个答案:

答案 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次?

据我所知,这是不可能的。但是,如果有办法,请告诉我。