diff --git a/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs b/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs index c8d8fbff..f5f50405 100644 --- a/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs +++ b/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs @@ -1668,11 +1668,6 @@ Expression ParseMemberAccess(Type type, Expression instance) throw ParseError(errorPos, Res.MethodsAreInaccessible, TypeHelper.GetTypeName(method.DeclaringType)); } - if (method.ReturnType == typeof(void)) - { - throw ParseError(errorPos, Res.MethodIsVoid, id, TypeHelper.GetTypeName(method.DeclaringType)); - } - if (instance == null) { return Expression.Call(null, method, args); diff --git a/test/System.Linq.Dynamic.Core.Tests/DynamicExpressionParserTests.cs b/test/System.Linq.Dynamic.Core.Tests/DynamicExpressionParserTests.cs index f1789589..d85b6db7 100644 --- a/test/System.Linq.Dynamic.Core.Tests/DynamicExpressionParserTests.cs +++ b/test/System.Linq.Dynamic.Core.Tests/DynamicExpressionParserTests.cs @@ -36,11 +36,26 @@ public int Foo() return 42; } + public void Bar() + { + Name = nameof(Foo); + } + public string Name { get; set; } public MyClass Child { get; set; } } + private class MyClassCustomTypeProvider : DefaultDynamicLinqCustomTypeProvider + { + public override HashSet GetCustomTypes() + { + var customTypes = base.GetCustomTypes(); + customTypes.Add(typeof(MyClass)); + return customTypes; + } + } + private class ComplexParseLambda1Result { public int? Age; @@ -1197,5 +1212,23 @@ public void DynamicExpressionParser_ParseLambda_NullPropagation_MethodCallExpres // Assert result.Should().BeNull(); } + + [Fact] + public void DynamicExpressionParser_ParseLambda_ActionDelegate_VoidMethodCallExpression() + { + // Arrange + var dataSource = new MyClass(); + var expressionText = "it.Bar()"; + var parsingConfig = new ParsingConfig { CustomTypeProvider = new MyClassCustomTypeProvider() }; + dataSource.Name.Should().BeNull(); + + // Act + LambdaExpression expression = DynamicExpressionParser.ParseLambda(typeof(Action), parsingConfig, dataSource.GetType(), null, expressionText); + Delegate del = expression.Compile(); + del.DynamicInvoke(dataSource); + + // Assert + dataSource.Name.Should().NotBeNullOrEmpty(); + } } }