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 #755 - revert to behavior from 7.4.0 and map to implementation not using DynamicGeneration Type #757

Closed
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
118 changes: 118 additions & 0 deletions src/Mapster.Tests/WhenMappingRecordRegression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,52 @@ public void MultiCtorAndInlineRecordWorked()
}


[TestMethod]
public void MappingInterfaceToInterface()
{

SampleInterfaceClsBase source = new SampleInterfaceClsBase
{
ActivityData = new SampleActivityData
{
Data = new SampleActivityParsedData
{
Steps = new List<string> { "A", "B", "C" }
},
Temp = "Temp data"

}

};
SampleInterfaceClsBase source2 = new SampleInterfaceClsBase
{
ActivityData = new SampleActivityData
{
Data = new SampleActivityParsedData
{
Steps = new List<string> { "X", "Y", "Z" }
},
Temp = "Update Temp data"

}

};

var target = source.Adapt<SampleInterfaceClsDerived>();
var target2 = source2.Adapt<SampleInterfaceClsBase>();
var update = target.Adapt(target2);

target.ShouldNotBeNull();
target.ShouldSatisfyAllConditions(
() => target.ActivityData.ShouldBe(source.ActivityData)
);

update.ActivityData.ShouldBe(target.ActivityData);

}



#region NowNotWorking

/// <summary>
Expand Down Expand Up @@ -305,6 +351,69 @@ public void CollectionUpdate()

#region TestClasses

public interface IActivityData : IActivityDataBase
{
public string Temp { get; set; }
}

public interface IActivityDataBase
{

}

public class SampleInterfaceClsBase
{
public IActivityDataBase? ActivityData { get; set; }

public SampleInterfaceClsBase()
{

}

public SampleInterfaceClsBase(IActivityDataBase data)
{
SetActivityData(data);
}

public void SetActivityData(IActivityDataBase data)
{
ActivityData = data;
}
}

public class SampleInterfaceClsDerived
{
public IActivityData? ActivityData { get; set; }

public SampleInterfaceClsDerived()
{

}

public SampleInterfaceClsDerived(IActivityData data)
{
SetActivityData(data);
}

public void SetActivityData(IActivityData data)
{
ActivityData = data;
}
}

public class SampleActivityData : IActivityData
{
public SampleActivityParsedData Data { get; set; }
public string Temp { get; set; }
}

public class SampleActivityParsedData
{
public List<string> Steps { get; set; } = new List<string>();
}



class MultiCtorAndInlinePoco
{
public int MyInt { get; set; }
Expand Down Expand Up @@ -499,5 +608,14 @@ sealed record TestSealedRecord()

sealed record TestSealedRecordPositional(int X);










#endregion TestClasses
}
16 changes: 16 additions & 0 deletions src/Mapster/Adapters/ReadOnlyInterfaceAdapter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,5 +45,21 @@ protected override Expression CreateInstantiationExpression(Expression source, E
return base.CreateInstantiationExpression(source,destination, arg);
}

protected override Expression CreateExpressionBody(Expression source, Expression? destination, CompileArgument arg)
{
if (source.Type.IsInterface)
{
if (arg.MapType != MapType.MapToTarget && source.Type.IsAssignableFrom(arg.DestinationType))
return Expression.Convert(source, arg.DestinationType);

if (arg.MapType == MapType.MapToTarget && destination.Type.IsAssignableFrom(arg.SourceType))
return source;

return base.CreateExpressionBody(source, destination, arg);
}

return base.CreateExpressionBody(source, destination, arg);
}

}
}
Loading