没有 setter 的 Automapper 嵌套集合
Automapper nested Collections without setter
我在 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)。理论上这应该 运行 没问题,但它没有向集合中添加任何元素。
如果我们更改集合 属性 添加一个 public setter,那么一切都很好。
如何在不添加 public setter 或 setter 的情况下获得嵌套集合?
感谢@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; }
}
此致。
我在 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)。理论上这应该 运行 没问题,但它没有向集合中添加任何元素。
如果我们更改集合 属性 添加一个 public setter,那么一切都很好。
如何在不添加 public setter 或 setter 的情况下获得嵌套集合?
感谢@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; }
}
此致。