Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 106 additions & 0 deletions src/Mapster.Tests/WhenUseDestinatonValueMappingRegression.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Shouldly;
using System.Collections.Generic;
using System.Linq;

namespace Mapster.Tests;

[TestClass]
public class WhenUseDestinatonValueMappingRegression
{
[TestClass]
public class WhenUseDestinatonMappingRegression
{
[TestMethod]
public void UseDestinatonValueUsingMapWithasParam()
{
TypeAdapterConfig<ThumbnailDetailsSource, ICollection<ThumbnailDestination>>
.NewConfig()
.MapWith(src => MapThumbnailDetailsData(src).ToList());

var channelSrc = new ChannelSource
{
ChannelId = "123",
Thumbnails = new ThumbnailDetailsSource
{
Default = new ThumbnailSource
{
Url = "https://www.youtube.com/default.jpg"
},
Medium = new ThumbnailSource
{
Url = "https://www.youtube.com/medium.jpg"
},
High = new ThumbnailSource
{
Url = "https://www.youtube.com/high.jpg"
}
},

TempThumbnails = new List<int>() { 1, 2, 3 }
};

var channelDest = channelSrc.Adapt<ChannelDestination>();

channelDest.Thumbnails.Count.ShouldBe(3);
channelDest.TempThumbnails.Count.ShouldBe(3);
}


#region TestClasses
private static IEnumerable<ThumbnailDestination> MapThumbnailDetailsData(ThumbnailDetailsSource thumbnailDetails)
{
yield return MapThumbnail(thumbnailDetails.Default, "Default");
yield return MapThumbnail(thumbnailDetails.Medium, "Medium");
yield return MapThumbnail(thumbnailDetails.High, "High");
}

private static ThumbnailDestination MapThumbnail(
ThumbnailSource thumbnail,
string thumbnailType) =>
new()
{
Type = thumbnailType,
Url = thumbnail.Url.Trim(),
};


public class ChannelDestination
{
public string ChannelId { get; set; } = default!;

[UseDestinationValue]
public ICollection<ThumbnailDestination> Thumbnails { get; } = new List<ThumbnailDestination>();

[UseDestinationValue]
public ICollection<string> TempThumbnails { get; } = new List<string>();
}

public class ThumbnailDestination
{
public string Type { get; set; } = default!;
public string Url { get; set; } = default!;
}

public class ChannelSource
{
public string ChannelId { get; set; } = default!;
public ThumbnailDetailsSource Thumbnails { get; set; } = default!;
public ICollection<int> TempThumbnails { get; set; } = new List<int>();
}

public class ThumbnailDetailsSource
{
public ThumbnailSource? Default { get; set; }
public ThumbnailSource? Medium { get; set; }
public ThumbnailSource? High { get; set; }
}

public class ThumbnailSource
{
public string Url { get; set; } = default!;
}

#endregion TestClasses
}
}
15 changes: 15 additions & 0 deletions src/Mapster/Adapters/BaseAdapter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -495,6 +495,21 @@ internal Expression CreateAdaptExpression(Expression source, Type destinationTyp
if (transform != null)
exp = transform.TransformFunc(exp.Type).Apply(arg.MapType, exp);
}
else
{
if (exp.NodeType != ExpressionType.Invoke)
{
var argExt = new CompileArgument
{
DestinationType = arg.DestinationType,
SourceType = arg.DestinationType,
MapType = MapType.MapToTarget,
Context = arg.Context,
};

return CreateAdaptExpressionCore(exp, destinationType, argExt, mapping, destination).To(destinationType);
}
}

return exp.To(destinationType);
}
Expand Down
Loading