2012-03-22 114 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; } 
} 

我的域名和視圖類...通用擴展方法

映射擴展

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

,我使用類似下面

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

但其長

我可以像下面這樣寫嗎?

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

是可能的嗎?

回答

4

不,因爲第一個泛型參數不能被隱式推斷。

我會做這個

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

然後代碼仍然是短比它:

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

感謝丹尼爾,它爲我好:) – tobias 2012-03-22 13:02:49

+0

@tobias - 我忘了演員。 – 2012-03-22 13:03:26

0

把擴展方法上IEntity爲成員的方法。那麼你只能通過一種類型。

14

而不是通過所有的籃球,爲什麼不使用的跳躍:

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

對於任何想知道的人,我只是做了一個快速測試,在LINQPad的一個循環中映射一個具有1,000,000次多個嵌套實體的對象圖。沒有任何明顯的性能差異。 – kwcto 2013-03-11 23:58:32

+1

我已經使用這種方法一段時間了,它的效果很好。但是靜態API現在在AutoMapper中已經過時了。 – Andreas 2016-02-22 13:11:27