diff --git a/src-console/System.Linq.Dynamic.Core.ConsoleTestApp.net40/ConsoleApp_net40_sqlite_original.csproj b/src-console/System.Linq.Dynamic.Core.ConsoleTestApp.net40/ConsoleApp_net40_sqlite_original.csproj index c4b12873..459c5903 100644 --- a/src-console/System.Linq.Dynamic.Core.ConsoleTestApp.net40/ConsoleApp_net40_sqlite_original.csproj +++ b/src-console/System.Linq.Dynamic.Core.ConsoleTestApp.net40/ConsoleApp_net40_sqlite_original.csproj @@ -97,6 +97,12 @@ Helpers\TestEnum.cs + + Helpers\Models\UserProfileDetails.cs + + + Helpers\Models\UserState.cs + diff --git a/src/System.Linq.Dynamic.Core/DynamicExpressionParser.cs b/src/System.Linq.Dynamic.Core/DynamicExpressionParser.cs index 50ac719d..327901df 100644 --- a/src/System.Linq.Dynamic.Core/DynamicExpressionParser.cs +++ b/src/System.Linq.Dynamic.Core/DynamicExpressionParser.cs @@ -173,7 +173,7 @@ public static LambdaExpression ParseLambda([NotNull] Type itType, [CanBeNull] Ty [PublicAPI] public static LambdaExpression ParseLambda([CanBeNull] ParsingConfig parsingConfig, [NotNull] Type itType, [CanBeNull] Type resultType, string expression, params object[] values) { - return ParseLambda(true, itType, resultType, expression, parsingConfig, values); + return ParseLambda(parsingConfig, true, itType, resultType, expression, values); } /// diff --git a/test/System.Linq.Dynamic.Core.Tests/DynamicExpressionParserTests.cs b/test/System.Linq.Dynamic.Core.Tests/DynamicExpressionParserTests.cs index da600982..4af2f273 100644 --- a/test/System.Linq.Dynamic.Core.Tests/DynamicExpressionParserTests.cs +++ b/test/System.Linq.Dynamic.Core.Tests/DynamicExpressionParserTests.cs @@ -32,6 +32,11 @@ public class ComplexParseLambda3Result public int TotalIncome { get; set; } } + public class CustomClassWithStaticMethod + { + public static int GetAge(int x) => x; + } + private class TestCustomTypeProvider : AbstractDynamicLinqCustomTypeProvider, IDynamicLinkCustomTypeProvider { private HashSet _customTypes; @@ -44,6 +49,7 @@ public virtual HashSet GetCustomTypes() } _customTypes = new HashSet(FindTypesMarkedWithDynamicLinqTypeAttribute(new[] { GetType().GetTypeInfo().Assembly })); + _customTypes.Add(typeof(CustomClassWithStaticMethod)); return _customTypes; } } @@ -413,5 +419,27 @@ public void ParseLambda_IllegalMethodCall_ThrowsException() }) .Throws().WithMessage("Methods on type 'Stream' are not accessible"); } + + [Fact] + public void ParseLambda_CustomMethod() + { + var config = new ParsingConfig + { + CustomTypeProvider = new TestCustomTypeProvider() + }; + + var context = new CustomClassWithStaticMethod(); + var original = $"{nameof(CustomClassWithStaticMethod)}.{nameof(CustomClassWithStaticMethod.GetAge)}(10)"; + int result = 0; + Check.ThatCode(() => + { + var expression = System.Linq.Dynamic.Core.DynamicExpressionParser.ParseLambda(config, typeof(CustomClassWithStaticMethod), null, original); + Delegate del = expression.Compile(); + result = (int) del.DynamicInvoke(context); + }) + .DoesNotThrow(); + + Check.That(result).IsEqualTo(10); + } } }