From d3b1b85c7add7d523b0f01d6d3ff891b535d62b4 Mon Sep 17 00:00:00 2001 From: timramone Date: Fri, 3 Oct 2025 23:38:19 +0400 Subject: [PATCH] draft of a fix for MindboxExpressionStringBuilder --- .../ExpandExpressionTests.cs | 44 ++++++++++++++++++- .../Caching/MindboxExpressionStringBuilder.cs | 18 ++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/Mindbox.Expressions.Tests/ExpandExpressionTests.cs b/Mindbox.Expressions.Tests/ExpandExpressionTests.cs index 95ec4ff..9a017d6 100644 --- a/Mindbox.Expressions.Tests/ExpandExpressionTests.cs +++ b/Mindbox.Expressions.Tests/ExpandExpressionTests.cs @@ -15,13 +15,55 @@ namespace Mindbox.Expressions.Tests [TestClass] public class ExpandExpressionTests { + public interface ITest + { + int Value { get; } + } + + public class A : ITest + { + public int Value { get; set; } + } + + public class B : ITest + { + public int Value { get; set; } + } + [TestInitialize] public void Initialize() { ExpressionsConfiguration.ExpressionEvaluatorFactory = - () => InterpretingExpressionEvaluator.Instance; + () => CachingCompilingExpressionEvaluator.Instance; } + private Expression> + GetSimleFExpression() + where TTestInterface : ITest + { + Expression> f1 = x => x.Value; + return f1; + } + + private Expression>>> + GetFExpression() + where TTestInterface : ITest, new() + { + Expression>>> f1 = x => y => + x.Value + y.Value; + return f1; + } + + [TestMethod] + public void ExpandWithGenericParameters() + { + Expression> f2 = x => GetFExpression().Evaluate(x).Evaluate(x); + Expression> f3 = x => GetFExpression().Evaluate(x).Evaluate(x); + + var result1 = f2.ExpandExpressions(); + var result2 = f3.ExpandExpressions(); + } + [TestMethod] public void ExpandExpressionsSimpleTest() { diff --git a/Mindbox.Expressions/Evaluators/Caching/MindboxExpressionStringBuilder.cs b/Mindbox.Expressions/Evaluators/Caching/MindboxExpressionStringBuilder.cs index a56dbd3..6886d18 100644 --- a/Mindbox.Expressions/Evaluators/Caching/MindboxExpressionStringBuilder.cs +++ b/Mindbox.Expressions/Evaluators/Caching/MindboxExpressionStringBuilder.cs @@ -565,6 +565,24 @@ protected override Expression VisitMethodCall(MethodCallExpression node) Out("."); } Out(node.Method.Name); + + if (node.Method.IsGenericMethod) + { + Out("<"); + var isFirst = true; + foreach (var genericArgument in node.Method.GetGenericArguments()) + { + if (!isFirst) + { + Out(","); + } + isFirst = false; + + Out(genericArgument.ToString()); + } + Out(">"); + } + Out("("); for (int i = start, n = node.Arguments.Count; i < n; i++) {