From 6674972433ca8dd357c0c61921338b403d4c71d5 Mon Sep 17 00:00:00 2001 From: Sylvain Jourdan Date: Fri, 7 Jun 2019 16:07:46 +0200 Subject: [PATCH] FIX : reducer on concrete classe using abstract property --- .gitignore | 5 ++-- .../Expressions/ExpressionReducerTests.cs | 26 ++++++++++++++++--- NExtends/Expressions/ExpressionReducer.cs | 11 ++++++-- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 0181471..d88e8dd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ -*/bin/* + +*/bin/* */obj/* *.suo @@ -18,4 +19,4 @@ packages/# NuGet Packages /OpenCover.4.6.519 /ComputeVersion.ps1 /.versionCounter -/NExtends/*.user +/NExtends/*.user \ No newline at end of file diff --git a/NExtends.Tests/Expressions/ExpressionReducerTests.cs b/NExtends.Tests/Expressions/ExpressionReducerTests.cs index f751b7a..2b54cbd 100644 --- a/NExtends.Tests/Expressions/ExpressionReducerTests.cs +++ b/NExtends.Tests/Expressions/ExpressionReducerTests.cs @@ -1,6 +1,7 @@ using NExtends.Expressions; using System; using System.Collections.Generic; +using System.Linq.Expressions; using Xunit; namespace NExtends.Tests.Expressions @@ -20,9 +21,9 @@ public UserDate(User owner, DateTime date) public class ExpressionReducerTests { - DateTime today = DateTime.Today; - List elements = new List { 0, 1, 2 }; - UserDate fakeUd = new UserDate(new User(), DateTime.Today); + readonly DateTime today = DateTime.Today; + readonly List elements = new List { 0, 1, 2 }; + readonly UserDate fakeUd = new UserDate(new User(), DateTime.Today); [Fact] public void ExpressionReducerEmptyLogic() @@ -111,5 +112,22 @@ public void ExpressionReducerInterfaceMember() Assert.Equal("u => (u.Content != null)", result.ToString()); } - } + + abstract class AbstractTruc + { + public User User { get; set; } + } + + class ConcreteBiduleContainer : AbstractTruc + { + public User User2 { get; set; } + } + + [Fact] + public void ExpressionReducerAbstractClassMember() + { + var result = ExpressionReducer.Reduce(bc => bc.User.Id != 0 && bc.User2.Id != 23, u => u.User, true); + Assert.Equal("u => (u.Id != 0)", result.ToString()); + } + } } \ No newline at end of file diff --git a/NExtends/Expressions/ExpressionReducer.cs b/NExtends/Expressions/ExpressionReducer.cs index 699ad1e..e64a2fe 100644 --- a/NExtends/Expressions/ExpressionReducer.cs +++ b/NExtends/Expressions/ExpressionReducer.cs @@ -120,7 +120,7 @@ protected override Expression VisitMember(MemberExpression node) var result = base.VisitMember(node); //Même membre, branché sur le paramètre => on remplace - if (CurrentNodeDependsOnPreviousParameter && node.Member == Reducer.Member) + if (CurrentNodeDependsOnPreviousParameter && AreEquals(node.Member, Reducer.Member)) { CurrentNodeDependsOnPreviousParameter = false; result = Parameter; @@ -131,7 +131,14 @@ protected override Expression VisitMember(MemberExpression node) return result; } - protected override Expression VisitParameter(ParameterExpression node) + private bool AreEquals(MemberInfo member1, MemberInfo member2) + { + return member1.DeclaringType == member2.DeclaringType + && member1.Name == member2.Name; + } + + + protected override Expression VisitParameter(ParameterExpression node) { //on sauvegarde la dépendance du noeud courant au paramètre d'entrée CurrentNodeDependsOnPreviousParameter = true;