Open
Description
Discussed in #688
Originally posted by akordowski March 24, 2024
Hi everyone!
I am currently struggling with the mapping of a readonly ICollection property. I followed the instructions but I can't make it work. The readonly collection is not populated with the mapped content. What am I making wrong? Have anyone an idea how I can make it work?
Here the code:
Programm.cs
var config = TypeAdapterConfig.GlobalSettings;
config.Scan(typeof(ChannelMapping).Assembly);
config.Default.UseDestinationValue(m => m.SetterModifier == AccessModifier.None &&
m.Type.IsGenericType &&
m.Type.GetGenericTypeDefinition() == typeof(ICollection<>));
var channelSrc = new MapsterTest.Objects.Source.Channel
{
ChannelId = "123",
Thumbnails = new MapsterTest.Objects.Source.ThumbnailDetails
{
Default = new MapsterTest.Objects.Source.Thumbnail
{
Url = "https://www.youtube.com/default.jpg"
},
Medium = new MapsterTest.Objects.Source.Thumbnail
{
Url = "https://www.youtube.com/medium.jpg"
},
High = new MapsterTest.Objects.Source.Thumbnail
{
Url = "https://www.youtube.com/high.jpg"
}
}
};
// Thumbnails are mapped correctly to a collection
var thumbnailsDest = channelSrc.Thumbnails.Adapt<ICollection<MapsterTest.Objects.Destination.Thumbnail>>().ToList();
// channelDest.Thumbnails collection is empty
var channelDest = channelSrc.Adapt<MapsterTest.Objects.Destination.Channel>();
ThumbnailMapping.cs
public class ThumbnailMapping : IRegister
{
public void Register(TypeAdapterConfig config)
{
config.ForType<Objects.Source.ThumbnailDetails, ICollection<Objects.Destination.Thumbnail>>()
.MapWith(src => MapThumbnailDetails(src).ToList());
}
private static IEnumerable<Objects.Destination.Thumbnail> MapThumbnailDetails(Objects.Source.ThumbnailDetails thumbnailDetails)
{
yield return MapThumbnail(thumbnailDetails.Default, "Default");
yield return MapThumbnail(thumbnailDetails.Medium, "Medium");
yield return MapThumbnail(thumbnailDetails.High, "High");
}
private static Objects.Destination.Thumbnail MapThumbnail(
Objects.Source.Thumbnail thumbnail,
string thumbnailType) =>
new()
{
Type = thumbnailType,
Url = thumbnail.Url.Trim(),
};
}
Channel.cs (Destination)
public class Channel
{
public string ChannelId { get; set; } = default!;
public ICollection<Thumbnail> Thumbnails { get; } = new List<Thumbnail>();
}
Thumbnail.cs (Destination)
public class Thumbnail
{
public string Type { get; set; } = default!;
public string Url { get; set; } = default!;
}
Channel.cs (Source)
public class Channel
{
public string ChannelId { get; set; } = default!;
public ThumbnailDetails Thumbnails { get; set; } = default!;
}
ThumbnailDetails.cs (Source)
public class ThumbnailDetails
{
public Thumbnail? Default { get; set; }
public Thumbnail? Medium { get; set; }
public Thumbnail? High { get; set; }
}
Thumbnail.cs (Source)
public class Thumbnail
{
public string Url { get; set; } = default!;
}