diff --git a/src/DotVVM.Framework.Tests.Common/Binding/ExpressionHelperTests.cs b/src/DotVVM.Framework.Tests.Common/Binding/ExpressionHelperTests.cs index 79e8bbf97a..050fcfaefd 100644 --- a/src/DotVVM.Framework.Tests.Common/Binding/ExpressionHelperTests.cs +++ b/src/DotVVM.Framework.Tests.Common/Binding/ExpressionHelperTests.cs @@ -122,6 +122,12 @@ public void Call_FindOverload_Generic_Array(Type resultIdentifierType, Type[] ar Call_FindOverload_Generic(typeof(MethodsGenericArgumentsResolvingSampleObject4), MethodsGenericArgumentsResolvingSampleObject4.MethodName, argTypes, resultIdentifierType, expectedGenericArgs); } [TestMethod] + [DataRow(typeof(int), new Type[] { typeof(int[]) }, new Type[] { typeof(int) })] + public void Call_FindOverload_Generic_Enumerable_Array(Type resultIdentifierType, Type[] argTypes, Type[] expectedGenericArgs) + { + Call_FindOverload_Generic(typeof(MethodsGenericArgumentsResolvingSampleObject6), MethodsGenericArgumentsResolvingSampleObject6.MethodName, argTypes, resultIdentifierType, expectedGenericArgs); + } + [TestMethod] [DataRow(typeof(GenericTestResult1), new Type[] { typeof(GenericModelSampleObject) }, new Type[] { typeof(int) })] [DataRow(typeof(GenericTestResult2), new Type[] { typeof(List[]) }, new Type[] { typeof(int) })] public void Call_FindOverload_Generic_Array_Recursive(Type resultIdentifierType, Type[] argTypes, Type[] expectedGenericArgs) @@ -130,6 +136,11 @@ public void Call_FindOverload_Generic_Array_Recursive(Type resultIdentifierType, } } + public static class MethodsGenericArgumentsResolvingSampleObject6 + { + public const string MethodName = nameof(TestMethod); + public static T2 TestMethod(IEnumerable a) => default; + } public static class MethodsGenericArgumentsResolvingSampleObject5 { public const string MethodName = nameof(TestMethod); diff --git a/src/DotVVM.Framework/Compilation/Binding/ExpressionHelper.cs b/src/DotVVM.Framework/Compilation/Binding/ExpressionHelper.cs index 91f678ce00..feb3ee6f1e 100644 --- a/src/DotVVM.Framework/Compilation/Binding/ExpressionHelper.cs +++ b/src/DotVVM.Framework/Compilation/Binding/ExpressionHelper.cs @@ -289,7 +289,16 @@ private static Type GetGenericParameterType(Type genericArg, Type[] searchedGene } else if (sgt.IsGenericType) { - var value = GetGenericParameterType(genericArg, sgt.GetGenericArguments(), expressionTypes[i].GetGenericArguments()); + Type[] genericArguments; + var expression = expressionTypes[i]; + + // Arrays need to be handled in a special way to obtain instantiation + if (expression.IsArray) + genericArguments = new[] { expression.GetElementType() }; + else + genericArguments = expression.GetGenericArguments(); + + var value = GetGenericParameterType(genericArg, sgt.GetGenericArguments(), genericArguments); if (value is Type) return value; } }