Общий метод расширения для автомпера - PullRequest
5 голосов
/ 22 марта 2012
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();

это возможно?

Ответы [ 3 ]

15 голосов
/ 12 марта 2013

Вместо того, чтобы прыгать через все эти обручи, почему бы просто не использовать:

public static TDestination ToModel<TDestination>(this object source)
{
    return Mapper.Map<TDestination>(source);
}
4 голосов
/ 22 марта 2012

Нет, потому что 1-й универсальный аргумент не может быть неявно выведен.

Я бы сделал это

    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 голосов
/ 22 марта 2012

Поместите метод расширения на IEntity в качестве метода-члена. Тогда вам нужно пройти только один тип.

...