根据属性列表指定AutoMapper映射

时间:2018-07-31 08:50:07

标签: c# generics automapper

大家好,

我不确定是否有可能,或者我正在与风车作斗争,但是我想完成的工作是基于AutoMapper的通用映射器。

使用此映射器,我可以指定一些要映射的类型,并且源类型和目标类型都将相同。

然后,我想提供属性列表作为方法的参数,该方法将指定特定类型上所有属性的子集。

因此,调用方法将如下所示:

给出以下方法签名

public T Map<TProp>(T source1, T source2, params Expression<Func<T,TProp>>[] propsToMap)

amm代表AutoModelMapper。

amm.Map<>(
        adminFeeSource,
        adminFeeDestination,
        fee => fee.FeeAmount,
        fee => fee.NoValueMessage);

如何以安全的方式(使用泛型)实现这一目标?那有可能吗?

亲切的问候

1 个答案:

答案 0 :(得分:0)

由于AFAIK,您不知道您的问题TBH,因此您需要注册AutoMapper的映射才能根据其文档工作,但是请问这是否对您有帮助。

使用静态Mapper

public class MapperConfig
{
    public static MapperConfiguration MapperCfg { get; private set; }
    public static IMapper Mapper { get; private set; }

    public static void RegisterMappings()
    {
        MapperCfg = new MapperConfiguration(cfg =>
        {
            cfg.AllowNullCollections = true;
            cfg.AllowNullDestinationValues = true;

            #region Entity VMs

            cfg.CreateMap<Address, AddressVM>().MaxDepth(3).ReverseMap();
            cfg.CreateMap<ApplicationUserConfig, ApplicationUserConfigVM>().MaxDepth(3).ReverseMap();
            // ... You need to define the objects in the mapper config
            cfg.CreateMap<WarehouseConfig, WarehouseConfigVM>().MaxDepth(3).ReverseMap();

            #endregion
        });

        Mapper = MapperCfg.CreateMapper();
    }
}

在应用程序启动时,调用MapperConfig.RegisterMappings();以注册模型映射。

然后您可以创建扩展程序

public static class Extension
{
    public static IPagedList<TDestination> ToMappedPagedList<TSource, TDestination>(this IPagedList<TSource> list)
    {
        IMapper mapper = MapperConfig.Mapper;

        IEnumerable<TDestination> sourceList = mapper.Map<IEnumerable<TDestination>>(list);
        IPagedList<TDestination> pagedResult = new StaticPagedList<TDestination>(sourceList, list.GetMetaData());

        return pagedResult;
    }

    public static IEnumerable<TDestination> Map<TSource, TDestination>(this IEnumerable<TSource> list)
        where TSource : class
        where TDestination : class, new()
    {
        IMapper mapper = MapperConfig.Mapper;

        IEnumerable<TDestination> sourceList = mapper.Map<IEnumerable<TDestination>>(list);

        return sourceList;
    }

    public static TDestination Map<TSource, TDestination>(this TSource entity)
        where TSource : class
        where TDestination : class, new()
    {
        IMapper mapper = MapperConfig.Mapper;

        return mapper.Map<TDestination>(entity);
    }
}

理想情况下,您应该将IMapper注册到IoC容器中,而不是直接在MapperConfig.Mapper中调用Extention.cs,但这将用于示例。

用法:

Address address = new Address();
AddressVM = address.Map<Address, AddressVM>();