Skip to content

Commit 848e2d8

Browse files
authored
Fix ArgumentException for arrays with different types of values #210 (#214)
* Fix ArgumentException for arrays with different types of values #210
1 parent ccea45b commit 848e2d8

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

ClosedXML.Report/FormulaEvaluator.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ private string Trim(string formula)
7878

7979
internal Delegate ParseExpression(string formula, ParameterExpression[] parameters)
8080
{
81-
if (!_lambdaCache.TryGetValue(formula, out var lambda))
81+
var cacheKey = GetCacheKey(formula, parameters);
82+
if (!_lambdaCache.TryGetValue(cacheKey, out var lambda))
8283
{
8384
try
8485
{
@@ -89,11 +90,16 @@ internal Delegate ParseExpression(string formula, ParameterExpression[] paramete
8990
return null;
9091
}
9192

92-
_lambdaCache.Add(formula, lambda);
93+
_lambdaCache.Add(cacheKey, lambda);
9394
}
9495
return lambda;
9596
}
9697

98+
private string GetCacheKey(string formula, ParameterExpression[] parameters)
99+
{
100+
return formula + string.Join("+", parameters.Select(x => x.Type.Name));
101+
}
102+
97103
private object Eval(string expression, Parameter[] pars)
98104
{
99105
var parameters = pars.Select(p => p.ParameterExpression).ToArray();

tests/ClosedXML.Report.Tests/FormulaEvaluatorTests.cs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ public void ExpressionParseTestNullPropagation()
9999
eval.Evaluate(@"{{np(b.Manager.Name, null)}}").Should().BeNull();
100100
}
101101

102-
[Fact(Skip = "It doesn't work yet")]
102+
[Fact]
103103
public void EvalDictionaryParams()
104104
{
105105
Parameter CreateDicParameter(string name) => new Parameter("item", new Dictionary<string, object>
@@ -110,7 +110,7 @@ public void EvalDictionaryParams()
110110
eval.Evaluate("{{item.Name.FirstName}}", CreateDicParameter("John")).Should().Be("John");
111111
}
112112

113-
[Fact(Skip = "It doesn't work yet")]
113+
[Fact]
114114
public void EvalDictionaryParams2()
115115
{
116116
object CreateDicParameter(string name) => new Dictionary<string, object>
@@ -134,6 +134,25 @@ public void UsingDynamicLinqTypeTest()
134134
eval.Evaluate("{{EvaluateUtils.ParseAsInt(a).IncrementMe()}}").Should().Be(2);
135135
}
136136

137+
[Fact]
138+
public void EvalMixedArray()
139+
{
140+
var mixed = new object[] {
141+
"string",
142+
1,
143+
0.1,
144+
System.DateTime.Today,
145+
};
146+
147+
var eval = new FormulaEvaluator();
148+
eval.AddVariable("mixed", mixed);
149+
eval.Evaluate("{{mixed.Count()}}").Should().Be(4);
150+
foreach (var item in mixed)
151+
{
152+
eval.Evaluate("{{item}}", new Parameter("item", item));
153+
}
154+
}
155+
137156
class Customer
138157
{
139158
public int Id { get; set; }

0 commit comments

Comments
 (0)