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

mi dominio y ver clases ...método de extensión genérico para AutoMapper

y

para la extensión de mapeo

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

y estoy usando, como a continuación

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

pero es largo

¿puedo escribirlo como a continuación?

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

¿eso es posible?

Respuesta

4

No porque el 1er argumento genérico no se puede inferir implícitamente.

Me gustaría hacer esto

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

A continuación, el código todavía está en corto de lo que era:

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

gracias Daniel, es bueno para mí :) – tobias

+0

@tobias - Se me olvidó el reparto. –

0

Ponga el método de extensión en IEntity como método miembro. Entonces debes pasar solo un tipo.

14

En lugar de saltar a través de todos los aros, ¿por qué no usan:

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

Para cualquiera que se lo pregunte, acabo de hacer una prueba rápida mapeando un gráfico de objetos con varias entidades anidadas 1,000,000 veces en un ciclo en LINQPad. No hubo diferencia de rendimiento discernible en absoluto. – kwcto

+1

He utilizado este enfoque desde hace un tiempo y funciona muy bien. Pero la API estática ahora está obsoleta en AutoMapper. – Andreas

Cuestiones relacionadas