2011-02-05 60 views
1

我想知道如何自動映射這個或如果它可以完成(我想沒有,但我只是想檢查)。自動映射器可以做到這一點嗎?

我有這樣的事情

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); 

所以,現在我得到了selectlistitems映射。現在我想添加「map」到viewModel。我想要將相同的「地圖」添加到viewModel 5次。

是否有可能以某種方式使用automapper說這個「地圖」並將其映射5次到我的viewModel?

或者我必須使用for循環嗎?

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

就像我說的,我不認爲這是可能的,但我很好奇地想知道,因爲我沒有使用atuomapper長。

+0

當我說你想擁有5個SelectedListItems列表時,我有沒有正確地對待你?你想獲得什麼? – Rookian 2011-02-05 21:26:25

回答

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說拿這個 「地圖」 和地圖它5次我viewModel?

據我所知這是不可能的。但是,讓我知道是否有辦法做到這一點。

相關問題