自动映射器从列表到对象的复杂映射



>我的对象结构如下

public class Source
{
public Connection Connection { get; set;}
}
public class Connection
{
public string Id { get; set;
public IEnumerable<Distributor> Distributors { get; set;
}
public class Distributor { get; set; }
{
public DistributorType Type {get; set;}
public  string X { get; set; }
public string Y { get; set; }
}
public class Destination
{
public Distribution Distribution { get; set;
}
public class Distribution
{
public string Id { get; set;}
public  string X { get; set; }
public string Y { get; set; }
}

我想将属性分布的源映射到目标。映射如下

Source.Connection.Distributors.FirstOrDefault().X => Destination.Distribution.X
Source.Connection.Distributors.FirstOrDefault().Y => Destination.Distribution.Y
Source.Connection.Id => Destination.Distribution.Id 

我尝试使用自定义解析程序,但没有运气

public class CustomDistributorResolver : IValueResolver<Source, Destination, Distribution >
{
public Distribution  Resolve(Source source, Destination destination, Distribution destMember, ResolutionContext context)
{
var result = source.Connection.Distributors.FirstOrDefault(x => x.DistributorType =="ABC");
if (result == null) return null;
return new Distribution 
{
Id                      = source.Connection?.Id,
X                       = result.X,
Y                       = result.Y
};
}
}

映射位置文件

CreateMap<Source, Destination>()
.ForMember(d => d.Distribution, opt => opt.MapFrom( new CustomDistributorResolver()));

我总是将分配值作为 NULL。

我不确定我在映射上做错了什么。

-艾伦-

我不太确定您将如何处理 IEnumerable。所以我使用 linq 来接近。

var id = Source.Connection.Id;
var distributions = Source.Connection.Distributors.Select(m=> new Distribution()
{
Id = id,
X = m.X,
Y = m.Y,
});

自动映射器想要:

CreateMap<Source, Destination>()
.ForMember(dest => dest.Distribution.Id ,opt => opt.MapFrom(src => src.Connection.Id))
.ForMember(dest => dest.Distribution.X,  opt => opt.MapFrom(src => src.Connection.Distributors.FirstOrDefault().X))
.ForMember(dest => dest.Distribution.Y,  opt => opt.MapFrom(src => src.Connection.Distributors.FirstOrDefault().Y));

您可以使用类型转换器

private class DestinationConverter : ITypeConverter<Source, Destination>
{
public Destination Convert(Source source,
Destination destination,
ResolutionContext context)
{
var result = source.Connection.Distributors.FirstOrDefault(x => x.Type == "ABC");
if (result == null) return null;
destination = new Destination();
destination.Distribution = new Distribution
{
Id = source.Connection?.Id,
X = result.X,
Y = result.Y
};
return destination;
}
}

并注册转换器

CreateMap<Source, Destination>().ConvertUsing<DestinationConverter>();

最新更新