diff --git a/src/AutoMapper/ConstructorMap.cs b/src/AutoMapper/ConstructorMap.cs index c8e990b967..2d3b4920dc 100644 --- a/src/AutoMapper/ConstructorMap.cs +++ b/src/AutoMapper/ConstructorMap.cs @@ -70,6 +70,8 @@ public class ConstructorParameterMap : MemberMap public ConstructorParameterMap(TypeMap typeMap, ParameterInfo parameter, MemberInfo[] sourceMembers) : base(typeMap) { Parameter = parameter; + var parameterType = parameter.ParameterType; + DestinationType = parameterType.IsByRef ? parameterType.GetElementType() : parameterType; if (sourceMembers.Length > 0) { MapByConvention(sourceMembers); @@ -80,7 +82,7 @@ public ConstructorParameterMap(TypeMap typeMap, ParameterInfo parameter, MemberI } } public ParameterInfo Parameter { get; } - public override Type DestinationType => Parameter.ParameterType; + public override Type DestinationType { get; protected set; } public override IncludedMember IncludedMember { get; protected set; } public override MemberInfo[] SourceMembers { get; set; } public override string DestinationName => Parameter.Name; diff --git a/src/UnitTests/Bug/ByrefConstructorParameter.cs b/src/UnitTests/Bug/ByrefConstructorParameter.cs new file mode 100644 index 0000000000..d0feda88c0 --- /dev/null +++ b/src/UnitTests/Bug/ByrefConstructorParameter.cs @@ -0,0 +1,41 @@ +namespace AutoMapper.UnitTests.Bug; + +public class ByrefConstructorParameter : AutoMapperSpecBase +{ + private Destination _destination; + + class Source + { + public TimeSpan X { get; set; } + } + + class Destination + { + public Destination(in TimeSpan x) + { + Y = x; + } + + public TimeSpan Y { get; } + } + + protected override MapperConfiguration CreateConfiguration() => new(cfg => + { + cfg.CreateMap(); + }); + + protected override void Because_of() + { + var source = new Source + { + X = TimeSpan.FromSeconds(17) + }; + _destination = Mapper.Map(source); + } + + [Fact] + public void should_just_work() + { + _destination.Y.ShouldBe(TimeSpan.FromSeconds(17)); + } +} \ No newline at end of file