首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有数组列表嵌套属性的AutoMapper映射

具有数组列表嵌套属性的AutoMapper映射
EN

Stack Overflow用户
提问于 2022-06-09 08:12:14
回答 2查看 509关注 0票数 0

我有一个A类,我需要用C类映射

代码语言:javascript
运行
复制
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类

代码语言:javascript
运行
复制
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‘类。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-09 09:14:58

例如,您有A类的数据,如

Name=User1

Address1

streetName = streetName1数= Number1

Address2

streetName = streetName2数= Number2

Address3

streetName = streetName3数= Number3

对于多个名称,您必须进行嵌套循环来访问类A对象中的每个数据,同时考虑将类MapAddressData的对象作为mappedAddress。

代码语言:javascript
运行
复制
foreach(var item from ClassAObject)
{
   mappedAddress.Name = item.Name;
   foreach(var address from item.Address)
   {
      mappedAddress.streetName = address.streetName;
      mappedAddress.Number= address.Number;
      >> Here you will be adding this mappedAddress objcect in mappedAddress from class C.

   }
}

附加代码示例只是为了得到更多的澄清

票数 -1
EN

Stack Overflow用户

发布于 2022-06-10 08:08:12

我不确定是否有一种更干净的方法可以做到这一点,但是您可以这样配置AutoMapper:

代码语言:javascript
运行
复制
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

然后我们在BMapAddressData之间创建一个映射。对于目标对象的Name属性,我们使用自定义解析器:MapAddressNameResolver检索值:

代码语言:javascript
运行
复制
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属性。

如果其中任何一个都不正确,我们将抛出一个异常,以便如果将来有人试图在其他上下文中使用此映射而不添加适当的支持,则该异常将失败。

全例

代码语言:javascript
运行
复制
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.");
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72556837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档