Automapper如何映射没有setter的嵌套集合。

3

我有一段代码片段在运行LinqPad(C#程序)中,已经包含了Automapper Nuget包6.1.1:

void Main()
{
    Mapper.Initialize(cfg =>
            {
                cfg.CreateMap<Top, TopDto>().ReverseMap();
            });

    Mapper.AssertConfigurationIsValid();

    var source = new TopDto
    {
        Id = 1,
        Name = "Charlie",
        Nicks = new List<string> { "Fernandez", "Others" }
    };


    var destination = Mapper.Map<Top>(source);

    destination.Dump();

}

// Define other methods and classes here
public class Top
{
    public Top()
    {
        Nicks = new List<string>();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<string> Nicks { get; }
}

public class TopDto
{
    public TopDto()
    {
        Nicks = new List<string>();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<string> Nicks { get; set; }
}

正如您所看到的,我们在设置嵌套集合时遇到了问题(完全没有Setter)。理论上这应该可以正常运行,但它没有向集合中添加任何元素。

如果我们更改集合属性并添加一个公共Setter,那么一切都很好。

我如何在不添加公共Setter或Setter的情况下获得嵌套集合?


1
{ o.MapFrom(s=>s.Nicks); o.UseDestinationValue(); });详情请查看 此链接 - Lucian Bargaoanu
嗨@LucianBargaoanu,关键是你的o.UseDestinationValue();。谢谢。你能把它写成答案以便接受吗?问候。 - ferpega
没关系。但如果您愿意,可以写一个更详细的答案。 - Lucian Bargaoanu
@LucianBargaoanu 我有一个问题。有没有一种方法可以全局定义这个?我正在更新我的 Mapper,似乎在 v6 之后私有 setter 没有被映射。我在整个项目中都有私有 setter,逐个设置似乎很困难。 - pratikvasa
https://docs.automapper.org/en/latest/10.0-Upgrade-Guide.html#all-collections-are-mapped-by-default-even-if-they-have-no-setter - Lucian Bargaoanu
1个回答

4
感谢@LucianBargaoanu(在评论中)的帮助,现在问题已经得到解决,方法如下:
void Main()
{
    Mapper.Initialize(cfg =>
            {
                cfg.CreateMap<Top, TopDto>().ReverseMap()
                    .ForMember(d => d.Nicks, o=> 
                                                { 
                                                    o.MapFrom(s => s.Nicks);
                                                    o.UseDestinationValue(); 
                                                });
            });

    Mapper.AssertConfigurationIsValid();

    var source = new TopDto(new List<string> { "Fernandez", "Others" })
    {
        Id = 1,
        Name = "Charlie"
    };


    var destination = Mapper.Map<Top>(source);

    destination.Dump();

}

// Define other methods and classes here
public class Top
{
    public Top()
    {
        Nicks = new List<string>();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<string> Nicks { get; }
}

public class TopDto
{
    public TopDto(List<string> nicks)
    {
        Nicks = nicks;
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<string> Nicks { get; private set; }
}

敬礼。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接