我有一个A类,我需要用C类映射
public class A{
public string Name {get; set;}
public List<B> Address {get; set;}}
public class B{
public string streetName{get; set;}
public int Number {get; set;}}我需要把这个映射到C类
public class C{
public int id{get;set;}
public List<MapAddressData> MapAddressData{get; set;}
public DateTime DateCreated {get; set;}}
public class MapAddressData{
public string Name {get; set;}
public string streetName {get; set;}
public int Number{get; set;}}所以我需要使用automapper来映射A类中的地址列表到C类中的MapAddressData列表。我不知道如何使用for循环来映射它,因为对于一个特定的名称,我们有很多地址,n必须一个一个地映射到C类中的'MapAddressData‘类。
发布于 2022-06-10 08:08:12
我不确定是否有一种更干净的方法可以做到这一点,但是您可以这样配置AutoMapper:
cfg.CreateMap<A, C>()
.BeforeMap((src, _, ctx) => ctx.Options.Items[$"__{nameof(A)}"] = src)
.ForMember(dst => dst.MapAddressData, mo => mo.MapFrom(src => src.Address));
cfg.CreateMap<B, MapAddressData>()
.ForMember(dst => dst.Name, mo => mo.MapFrom(new MapAddressNameResolver()));使用.BeforeMap,我们使用键"__A"将源值存储在映射上下文项集合中。
接下来,我们告诉AutoMapper,它应该使用源对象上的Address属性来映射目标对象上的MapAddressData。
然后我们在B和MapAddressData之间创建一个映射。对于目标对象的Name属性,我们使用自定义解析器:MapAddressNameResolver检索值:
private class MapAddressNameResolver : IValueResolver<B, MapAddressData, string>
{
public string Resolve(B source, MapAddressData destination, string destMember, ResolutionContext context)
{
if (context.Options.Items.TryGetValue($"__{nameof(A)}", out var parent)
&& parent is A sourceParent)
{
return sourceParent.Name;
}
throw new InvalidOperationException("Address cannot be mapped to MapAddressData indepdendently of A to C.");
}
}这将查看映射上下文项集合,并尝试检索存储在键"__A"上的值。如果它确实是A的一个实例,我们将返回它的Name属性。
如果其中任何一个都不正确,我们将抛出一个异常,以便如果将来有人试图在其他上下文中使用此映射而不添加适当的支持,则该异常将失败。
全例
public static void TestMethod()
{
var mapperConfig = new MapperConfiguration(cfg =>
{
cfg.CreateMap<A, C>()
.BeforeMap((src, _, ctx) => ctx.Options.Items[$"__{nameof(A)}"] = src)
.ForMember(dst => dst.MapAddressData, mo => mo.MapFrom(src => src.Address));
cfg.CreateMap<B, MapAddressData>()
.ForMember(dst => dst.Name, mo => mo.MapFrom(new MapAddressNameResolver()));
});
var mapper = mapperConfig.CreateMapper();
var sourceObject = new A()
{
Name = "bob",
Address = new List<B>()
{
new B()
{
Number = 5,
streetName = "bob street"
},
new B()
{
Number = 125,
streetName = "somewhere street"
}
}
};
var mappedObject = mapper.Map<C>(sourceObject);
}
private class MapAddressNameResolver : IValueResolver<B, MapAddressData, string>
{
public string Resolve(B source, MapAddressData destination, string destMember, ResolutionContext context)
{
if (context.Options.Items.TryGetValue($"__{nameof(A)}", out var parent) && parent is A sourceParent)
{
return sourceParent.Name;
}
throw new InvalidOperationException("Address cannot be mapped to MapAddressData indepdendently of A to C.");
}
}https://stackoverflow.com/questions/72556837
复制相似问题