大家好,
我不确定是否有可能,或者我正在与风车作斗争,但是我想完成的工作是基于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);
如何以安全的方式(使用泛型)实现这一目标?那有可能吗?
亲切的问候
答案 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>();