2011-11-22 6 views
3

Здравствуйте. У меня есть список, который выглядит как это:Карта автоматических карт пользовательских коллекций

public class PagedList<T> : List<T> 
{ 
    public PagedList(IEnumerable<T> collection) : base(collection) 
    { } 
    public int TotalItems { get; set; } 
    public int CurrentPage { get; set; } 
    public int PageSize { get; set; } 
    //some other properties 
} 

и используются в хранилище для пейджинга

public PagedList<TEntity> GetPaged(int page) 
{ 
    var pagedEntities = some_query; 
    return pagedEntities.AsPagedList(totalResults, page, pageSize); 
} 

То же PagedList также используются в аспе MVC Просмотр моделей для пейджинга. Можно ли сопоставить эти коллекции с помощью Automapper со всеми свойствами TotalItems/CurrentPage/...?

PagedList<DbItem> dbItems = _repository.GetPages(page); 
    var viewItems = new PagedList<SomeItemView>(); 
    Mapper.Map(dbItems , viewItems); 

Tahnk You!

ответ

4

Это сработало для меня. Вы ищете нечто более общее?

public class DbItem 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class ViewItem 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class PagedList<T>: List<T> 
{ 
    public int TotalItems { get; set; } 
    public int CurrentPage { get; set; } 
    public int PageSize { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     MapItems(); 
    } 

    public static void MapItems() 
    { 
     Mapper.CreateMap<DbItem, ViewItem>(); 
     Mapper.CreateMap<PagedList<DbItem>, PagedList<ViewItem>>() 
      .AfterMap((s, d) => Mapper.Map<List<DbItem>, List<ViewItem>>(s, d)); 

     var dbList = new PagedList<DbItem> 
         { 
          new DbItem {Id = 1, Name = "a"}, 
          new DbItem {Id = 2, Name = "b"} 
         }; 
     dbList.TotalItems = 2; 
     dbList.CurrentPage = 1; 
     dbList.PageSize = 10; 
     var viewList = Mapper.Map<PagedList<DbItem>, PagedList<ViewItem>>(dbList); 

     Console.WriteLine(viewList.TotalItems); 
     Console.WriteLine(viewList.CurrentPage); 
     Console.WriteLine(viewList.PageSize); 
     Console.WriteLine(viewList[0].Id + " " + viewList[0].Name); 
     Console.WriteLine(viewList[1].Id + " " + viewList[1].Name); 
     Console.ReadLine(); 
    } 
} 
+0

спасибо сэр. точно то, что мне нужно (: – shkipper

+0

Вы спасли мой день – tanathos

+0

Рад это слышать :) – boca

2

Что вам нужно, это пользовательский тип конвертора

public class PagedListConverter<TIn, TOut> : ITypeConverter<IPagedList<TIn>, IPagedList<TOut>> 
    { 
     public IPagedList<TOut> Convert(AutoMapper.ResolutionContext context) 
     { 

      var source = (IPagedList<TIn>)context.SourceValue; 

      var mapped = Mapper.Map<IList<TOut>>(source); 

      return new StaticPagedList<TOut>(mapped, source.GetMetaData()); 
     } 
    } 

Использование:

Mapper.CreateMap<IPagedList<Company>, IPagedList<CompanyViewModel>>().ConvertUsing<PagedListConverter<Company, CompanyViewModel>>(); 
+0

Вы тестировали это в новой версии Automapper ?? – Ehsan

Смежные вопросы