【问题标题】:Generic extension method for automapper自动映射器的通用扩展方法
【发布时间】:2012-03-22 12:56:29
【问题描述】:
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();

这可能吗?

【问题讨论】:

    标签: c# .net generics extension-methods automapper


    【解决方案1】:

    与其跳过所有这些障碍,不如直接使用:

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

    【讨论】:

    • 对于任何想知道的人,我刚刚做了一个快速测试,在 LINQPad 中循环映射具有多个嵌套实体的对象图 1,000,000 次。没有任何明显的性能差异。
    • 我已经使用这种方法一段时间了,效果很好。但静态 API 现在在 AutoMapper 中已过时。
    • 注意:静态 API 不再过时
    【解决方案2】:

    否,因为无法隐式推断第一个泛型参数。

    我会这样做

        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>();
    

    【讨论】:

      【解决方案3】:

      把扩展方法放在IEntity上作为成员方法。那么你只需要传递一种类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-03
        • 2017-11-04
        • 1970-01-01
        • 2012-06-24
        • 2017-08-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多