Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix issue #689 - Add support using MapWith as param in UseDestinatonValue #762

Open
wants to merge 3 commits into
base: development
Choose a base branch
from
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