diff --git a/src/AutoMapper/ExpressionExtensions.cs b/src/AutoMapper/ExpressionExtensions.cs index 7e3291c6fe..5fb6972a6b 100644 --- a/src/AutoMapper/ExpressionExtensions.cs +++ b/src/AutoMapper/ExpressionExtensions.cs @@ -166,7 +166,6 @@ protected override Expression VisitMember(MemberExpression node) internal class RemoveIfNotNullVisitor : ExpressionVisitor { private readonly Expression[] _expressions; - private readonly IList AllreadyUpdated = new List(); public RemoveIfNotNullVisitor(params Expression[] expressions) { @@ -196,9 +195,12 @@ public ConvertingVisitor(ParameterExpression oldParam, Expression newParam) protected override Expression VisitMember(MemberExpression node) { - return node.Expression == _oldParam - ? MakeMemberAccess(ToType(_newParam, _oldParam.Type), node.Member) - : base.VisitMember(node); + if (node.Expression == _oldParam) + { + node = MakeMemberAccess(ToType(_newParam, _oldParam.Type), node.Member); + } + + return base.VisitMember(node); } protected override Expression VisitParameter(ParameterExpression node) @@ -208,9 +210,12 @@ protected override Expression VisitParameter(ParameterExpression node) protected override Expression VisitMethodCall(MethodCallExpression node) { - return node.Object == _oldParam - ? Call(ToType(_newParam, _oldParam.Type), node.Method, node.Arguments) - : base.VisitMethodCall(node); + if (node.Object == _oldParam) + { + node = Call(ToType(_newParam, _oldParam.Type), node.Method, node.Arguments); + } + + return base.VisitMethodCall(node); } } @@ -227,7 +232,10 @@ public ReplaceExpressionVisitor(Expression oldExpression, Expression newExpressi public override Expression Visit(Expression node) { - return _oldExpression == node ? _newExpression : base.Visit(node); + if (_oldExpression == node) + node = _newExpression; + + return base.Visit(node); } } diff --git a/src/UnitTests/Bug/MapFromClosureBug.cs b/src/UnitTests/Bug/MapFromClosureBug.cs new file mode 100644 index 0000000000..4426b93753 --- /dev/null +++ b/src/UnitTests/Bug/MapFromClosureBug.cs @@ -0,0 +1,72 @@ +namespace AutoMapper.UnitTests.Bug +{ + using System; + using Rhino.Mocks; + using Should; + + public class MapFromClosureBug : SpecBaseBase + { + private static readonly IDateProvider _dateProvider; + + static MapFromClosureBug() + { + _dateProvider = MockRepository.GenerateMock(); + } + + public interface IDateProvider + { + DateTime CurrentRestaurantTime(Restaurant restaurant); + } + + public class Result + { + public Booking Booking { get; set; } + } + + public class Restaurant + { + } + + public class Booking + { + public Restaurant Restaurant { get; set; } + + public int? CalculateTotal(DateTime currentTime) + { + return null; + } + } + + public class ResultDto + { + public BookingDto Booking { get; set; } + } + + public class BookingDto + { + public int? Total { get; set; } + } + + public void Should_map_successfully() + { + var mapperConfiguration = new MapperConfiguration(cfg => + { + cfg.CreateMap(); + cfg.CreateMap() + .ForMember(d => d.Total, + o => o.MapFrom(b => b.CalculateTotal(_dateProvider.CurrentRestaurantTime(b.Restaurant)))); + }); + + var mapper = mapperConfiguration.CreateMapper(); + + var result = new Result { Booking = new Booking() }; + + // Act + var dto = mapper.Map(result); + + // Assert + dto.ShouldNotBeNull(); + } + + } +} \ No newline at end of file diff --git a/src/UnitTests/UnitTests.Net4.csproj b/src/UnitTests/UnitTests.Net4.csproj index 898e559d99..2e7b212965 100644 --- a/src/UnitTests/UnitTests.Net4.csproj +++ b/src/UnitTests/UnitTests.Net4.csproj @@ -110,6 +110,7 @@ +