Skip to content

Commit 6d37ec8

Browse files
Fix method overload issue with params when the last parameter is empy
1 parent dbfd26e commit 6d37ec8

File tree

3 files changed

+62
-3
lines changed

3 files changed

+62
-3
lines changed

Z.Dynamic.Core.Lab/Request_DynamicLinqType.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,16 @@ public static string[] ConvertToArray(params string[] values)
2525

2626
return values.ToArray();
2727
}
28+
29+
public static string[] ConvertToArray(int a, params string[] values)
30+
{
31+
if (values == null)
32+
{
33+
return null;
34+
}
35+
36+
return values.ToArray();
37+
}
2838
}
2939

3040
public static void Execute()
@@ -38,7 +48,7 @@ public static void Execute()
3848

3949
var t1 = Utils.ConvertToArray(null);
4050

41-
string query = "Utils.ConvertToArray(null)";
51+
string query = "Utils.ConvertToArray()";
4252
LambdaExpression expression = DynamicExpressionParser.ParseLambda(null, query, externals);
4353
Delegate del = expression.Compile();
4454
var result = del.DynamicInvoke();

src/System.Linq.Dynamic.Core/Parser/SupportedMethods/MethodFinder.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,12 @@ public int FindIndexer(Type type, Expression[] args, out MethodBase method)
113113

114114
bool IsApplicable(MethodData method, Expression[] args)
115115
{
116-
// parameter count must be equal or the last one must be a param array
117116
bool isParamArray = method.Parameters.Length > 0 && method.Parameters.Last().IsDefined(typeof(ParamArrayAttribute), false);
118-
if (method.Parameters.Length != args.Length && !isParamArray)
117+
118+
// if !paramArray, the number of parameter must be equal
119+
// if paramArray, the last parameter is optional
120+
if ((!isParamArray && method.Parameters.Length != args.Length) ||
121+
(isParamArray && method.Parameters.Length - 1 > args.Length))
119122
{
120123
return false;
121124
}

test/System.Linq.Dynamic.Core.Tests/Parser/DynamicLinqTypeTest.cs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,16 @@ public static string[] ConvertToArray(params string[] values)
1818

1919
return values.ToArray();
2020
}
21+
22+
public static string[] ConvertToArray(int a, params string[] values)
23+
{
24+
if (values == null)
25+
{
26+
return null;
27+
}
28+
29+
return values.ToArray();
30+
}
2131
}
2232

2333

@@ -67,5 +77,41 @@ public void ParamArray_WithSingleValue()
6777
Check.That(result.Length).Equals(1);
6878
Check.That(result[0]).Equals("a");
6979
}
80+
81+
[Fact]
82+
public void ParamArray_NullValue2()
83+
{
84+
var query = "Utils.ConvertToArray(0, null)";
85+
var expression = DynamicExpressionParser.ParseLambda(null, query, null);
86+
var del = expression.Compile();
87+
var result = (string[])del.DynamicInvoke();
88+
89+
Check.That(result).IsNull();
90+
}
91+
92+
[Fact]
93+
public void ParamArray_WithManyValue2()
94+
{
95+
var query = "Utils.ConvertToArray(0, \"a\", \"b\")";
96+
var expression = DynamicExpressionParser.ParseLambda(null, query, null);
97+
var del = expression.Compile();
98+
var result = (string[])del.DynamicInvoke();
99+
100+
Check.That(result.Length).Equals(2);
101+
Check.That(result[0]).Equals("a");
102+
Check.That(result[1]).Equals("b");
103+
}
104+
105+
[Fact]
106+
public void ParamArray_WithSingleValue2()
107+
{
108+
var query = "Utils.ConvertToArray(0, \"a\")";
109+
var expression = DynamicExpressionParser.ParseLambda(null, query, null);
110+
var del = expression.Compile();
111+
var result = (string[])del.DynamicInvoke();
112+
113+
Check.That(result.Length).Equals(1);
114+
Check.That(result[0]).Equals("a");
115+
}
70116
}
71117
}

0 commit comments

Comments
 (0)