2015-04-01 13 views
8

Ich habe auf StackOverflow gesucht und googelte darüber, aber ich habe keine Hilfe oder einen Vorschlag dazu finden können.AutoMapper generisches Mapping

Ich habe eine Klasse wie folgt aus Wich erstellen PagedList Objekt und verwendet auch AutoMappper Typen von der Quelle zur Karte zum Ziel

public class PagedList<TSrc, TDest> 
{ 
    protected readonly List<TDest> _items = new List<TDest>(); 

    public IEnumerable<TDest> Items { 
     get { return this._items; } 
    } 
} 

Ich möchte eine Karte für diese Art schaffen, die es in ein anderes umwandeln sollte Typ wie die folgenden

public class PagedListViewModel<TDest> 
{ 
    public IEnumerable<TDest> Items { get; set; } 
} 

ich mit

Mapper.CreateMap<PagedList<TSrc, TDest>, PagedListViewModel<TDest>>(); 
versucht haben

aber der Compiler wegen TSrc und TDest

Jeder Vorschlag beschwert?

Antwort

13

Nach the AutoMapper wiki:

public class Source<T> { 
    public T Value { get; set; } 
} 

public class Destination<T> { 
    public T Value { get; set; } 
} 

// Create the mapping 
Mapper.CreateMap(typeof(Source<>), typeof(Destination<>)); 

In Ihrem Fall wäre dies

Mapper.CreateMap(typeof(PagedList<,>), typeof(PagedListViewModel<>)); 
+0

Der Compiler beschwert sich über einen Fehler auf 'PagedList' und sagt' mit dem generischen Typ PagedList erfordert zwei Typen arguments' – Lorenzo

+1

@Lorenzo: Verwenden Sie 'typeof (PagedList <,>) 'um mehrere generische Typen anzugeben. –

+0

Vielen Dank! – Lorenzo

0

sein Dies ist eine bewährte Methode:

erster Schritt: Erstellen Sie eine generice Klasse.

public class AutoMapperGenericsHelper<TSource, TDestination> 
    { 
     public static TDestination ConvertToDBEntity(TSource model) 
     { 
      Mapper.CreateMap<TSource, TDestination>(); 
      return Mapper.Map<TSource, TDestination>(model); 
     } 
    } 

Zweiter Schritt: Sie es verwenden

[HttpPost] 
     public HttpResponseMessage Insert(LookupViewModel model) 
     { 
      try 
      { 
       EducationLookup result = AutoMapperGenericsHelper<LookupViewModel, EducationLookup>.ConvertToDBEntity(model); 
       this.Uow.EducationLookups.Add(result); 
       Uow.Commit(User.Id); 
       return Request.CreateResponse(HttpStatusCode.OK, result); 
      } 
      catch (DbEntityValidationException e) 
      { 
       return Request.CreateResponse(HttpStatusCode.InternalServerError, CustomExceptionHandler.HandleDbEntityValidationException(e)); 
      } 
      catch (Exception ex) 
      { 
       return Request.CreateResponse(HttpStatusCode.BadRequest, ex.HResult.HandleCustomeErrorMessage(ex.Message)); 
      } 

     } 
Verwandte Themen