Runtime parser for string expressions (formulas, method calls, properties/fields/arrays accessors). LambdaParser
builds dynamic LINQ expression tree and compiles it to the lambda delegate. Types are resolved at run-time like in dynamic languages.
- PCL (Portable) library: can be used with any .NET target: net40+sl5, net45+wp8+win8+wpa81, .NET Standards 1.3 (.NET Core apps)
- any number of variables (values can be provided as dictionary or by callback delegate)
- supports arithmetic operations (+, -, *, /, %), comparisons (==, !=, >, <, >=, <=), conditionals including (ternary) operator ( ? : )
- access object properties, call methods and indexers, invoke delegates
- dynamic typed variables: performs automatic type conversions to match method signature or arithmetic operations
- create arrays and dictionaries with simplified syntax:
new dictionary{ {"a", 1}, {"b", 2} }
,new []{ 1, 2, 3}
Nuget package: NReco.LambdaParser
var lambdaParser = new NReco.Linq.LambdaParser();
var varContext = new Dictionary<string,object>();
varContext["pi"] = 3.14M;
varContext["one"] = 1M;
varContext["two"] = 2M;
varContext["test"] = "test";
Console.WriteLine( lambdaParser.Eval("pi>one && 0<one ? (1+8)/3+1*two : 0", varContext) ); // --> 5
Console.WriteLine( lambdaParser.Eval("test.ToUpper()", varContext) ); // --> TEST
(see unit tests for more expression examples)
By default LambdaParser
uses ValueComparer
for values comparison. You can provide your own implementation or configure its option to get desired behaviour:
ValueComparer.NullComparison
determines how comparison withnull
is handled. 2 options:MinValue
: null is treated as minimal possible value for any type - like .NET IComparerSql
: null is not comparable with any type, including another null - like in SQL
ValueComparer.SuppressErrors
allows to avoid convert exception. If error appears during comparison exception is not thrown and this means that values are not comparable (= any condition leads tofalse
).
var valComparer = new ValueComparer() { NullComparison = ValueComparer.NullComparisonMode.Sql };
var lambdaParser = new LambdaParser(valComparer);
NReco.LambdaParser is in production use at SeekTable.com and PivotData microservice (used for user-defined calculated cube members: formulas, custom formatting).
Copyright 2016-2019 Vitaliy Fedorchenko
Distributed under the MIT license