Skip to content

Commit 62ab7d6

Browse files
committed
add Sealed record Detection and Test
1 parent 636eca0 commit 62ab7d6

2 files changed

Lines changed: 34 additions & 1 deletion

File tree

src/Mapster.Tests/WhenMappingRecordRegression.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,28 @@ public void AdaptClassToRecord()
6868
object.ReferenceEquals(_destination, _result).ShouldBeFalse();
6969
}
7070

71+
[TestMethod]
72+
public void AdaptToSealtedRecord()
73+
{
74+
var _sourceRecord = new TestRecord() { X = 2000 };
75+
var _destinationSealtedRecord = new TestSealedRecord() { X = 3000 };
76+
var _RecordResult = _sourceRecord.Adapt(_destinationSealtedRecord);
77+
78+
_RecordResult.X.ShouldBe(2000);
79+
object.ReferenceEquals(_destinationSealtedRecord, _RecordResult).ShouldBeFalse();
80+
}
81+
82+
[TestMethod]
83+
public void AdaptToSealtedPositionalRecord()
84+
{
85+
var _sourceRecord = new TestRecord() { X = 2000 };
86+
var _destinationSealtedPositionalRecord = new TestSealedRecordPositional(4000);
87+
var _RecordResult = _sourceRecord.Adapt(_destinationSealtedPositionalRecord);
88+
89+
_RecordResult.X.ShouldBe(2000);
90+
object.ReferenceEquals(_destinationSealtedPositionalRecord, _RecordResult).ShouldBeFalse();
91+
}
92+
7193
[TestMethod]
7294
public void AdaptClassToClassPublicCtrIsNotInstanse()
7395
{
@@ -408,5 +430,16 @@ record struct TestRecordStruct
408430
public int X { set; get; }
409431
}
410432

433+
/// <summary>
434+
/// Different Checked Constructor Attribute From Spec
435+
/// https://learn.microsoft.com/ru-ru/dotnet/csharp/language-reference/proposals/csharp-9.0/records#copy-and-clone-members
436+
/// </summary>
437+
sealed record TestSealedRecord()
438+
{
439+
public int X { get; set; }
440+
}
441+
442+
sealed record TestSealedRecordPositional(int X);
443+
411444
#endregion TestClasses
412445
}

src/Mapster/Utils/ReflectionUtils.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ public static bool IsRecordType(this Type type)
209209
var ctors = type.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public).ToList();
210210

211211
var isRecordTypeCtor = type.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic)
212-
.Where(x => x.IsFamily == true)
212+
.Where(x => x.IsFamily == true || (type.Attributes.HasFlag(TypeAttributes.Sealed) && x.IsPrivate == true)) // add target from Sealed record
213213
.Any(x => x.GetParameters()
214214
.Any(y => y.ParameterType == type));
215215

0 commit comments

Comments
 (0)