2012-03-22 17 views
5
public abstract class Entity : IEntity 
{ 
    [Key] 
    public virtual int Id { get; set; } 
} 

public class City:Entity 
{ 
    public string Code { get; set; } 
} 

public class BaseViewModel:IBaseViewModel 
{ 
    public int Id { get; set; } 
} 

public class CityModel:BaseViewModel 
{ 
    public string Code { get; set; } 
} 

moje klasy domeny i przeglądanie ...Typowa metoda rozszerzenie dla automapper

i

o przedłużenie odwzorowania

public static TModel ToModel<TModel,TEntity>(this TEntity entity) 
    where TModel:IBaseViewModel where TEntity:IEntity 
{ 
    return Mapper.Map<TEntity, TModel>(entity); 
} 

i używam jak poniżej

City city = GetCity(Id); 
CityModel model = f.ToModel<CityModel, City>(); 

, ale jego długo

Czy mogę napisać to tak, jak poniżej?

City city = GetCity(Id); 
CityModel model = f.ToModel(); 

czy to możliwe?

Odpowiedz

4

Nie, ponieważ pierwszy argument ogólny nie może zostać niejawnie wywnioskowany.

zrobiłbym to

public static TModel ToModel<TModel>(this IEntity entity) where TModel:IBaseViewModel 
    { 
     return (TModel)Mapper.Map(entity, entity.GetType(), typeof(TModel)); 
    } 

Następnie kod jest nadal zwarty niż było:

var city = GetCity(Id); 
var model = city.ToModel<CityModel>(); 
+0

dzięki Daniel, jego dobre dla mnie :) – tobias

+0

@tobias - zapomniałem obsady. –

0

Ustaw metodę rozszerzenia na IEntity jako metoda członkowskim. Następnie musisz przekazać tylko jeden typ.

14

Zamiast skoków przez wszystkie te obręcze, dlaczego nie wystarczy użyć:

public static TDestination ToModel<TDestination>(this object source) 
{ 
    return Mapper.Map<TDestination>(source); 
} 
+2

Dla każdego, kto się zastanawia, po prostu wykonałem szybki test z mapowaniem wykresu obiektów z kilkoma zagnieżdżonymi jednostkami 1 000 000 razy w pętli w LINQPad. Nie było żadnej zauważalnej różnicy w wydajności. – kwcto

+1

Używam tego podejścia już od jakiegoś czasu i działa świetnie. Ale statyczny interfejs API jest już przestarzały w AutoMapper. – Andreas