diff --git a/src/DynamicExpresso.Core/Parsing/Parser.cs b/src/DynamicExpresso.Core/Parsing/Parser.cs index c75a027..08e5985 100644 --- a/src/DynamicExpresso.Core/Parsing/Parser.cs +++ b/src/DynamicExpresso.Core/Parsing/Parser.cs @@ -2459,7 +2459,7 @@ private static Expression PromoteExpression(Expression expr, Type type, bool exa return Expression.Convert(expr, genericType); } - if (IsCompatibleWith(expr.Type, type)) + if (IsCompatibleWith(expr.Type, type) || expr is DynamicExpression) { if (type.IsValueType || exact) { diff --git a/test/DynamicExpresso.UnitTest/GithubIssues.cs b/test/DynamicExpresso.UnitTest/GithubIssues.cs index 37fee02..95d39d6 100644 --- a/test/DynamicExpresso.UnitTest/GithubIssues.cs +++ b/test/DynamicExpresso.UnitTest/GithubIssues.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Reflection; using System.Text.RegularExpressions; +using System.Dynamic; // ReSharper disable SpecifyACultureInStringConversionExplicitly @@ -772,6 +773,26 @@ public void GitHub_Issue_292() Assert.IsTrue(testnpcs.All(n => n.money == 10)); } + + [Test] + public void GitHub_Issue_295() { + var evaluator = new Interpreter(); + + // create path helper functions in expressions... + Func pathCombine = string.Concat; + evaluator.SetFunction("StringConcat", pathCombine); + + // add a GlobalSettings dynamic object... + dynamic globalSettings = new ExpandoObject(); + globalSettings.MyTestPath = "C:\\delme\\"; + evaluator.SetVariable("GlobalSettings", globalSettings); + + var works = (string) evaluator.Eval("StringConcat((string)GlobalSettings.MyTestPath,\"test.txt\")"); + Assert.That(works, Is.EqualTo("C:\\delme\\test.txt")); + + var doesntWork = (string) evaluator.Eval("StringConcat(GlobalSettings.MyTestPath,\"test.txt\")"); + Assert.That(doesntWork, Is.EqualTo("C:\\delme\\test.txt")); + } } internal static class GithubIssuesTestExtensionsMethods