using System.Collections.Generic;
using System.Text.RegularExpressions;
public static class DynamicExpression
public static T Evaluate<T>(string expression, Variable variable)
var interpreter = new Interpreter().SetVariable(variable);
return interpreter.Eval<T>(expression);
public static T Evaluate<T>(string expression, List<Variable> variables)
var interpreter = new Interpreter();
variables.ForEach(v => interpreter.SetVariable(v));
return interpreter.Eval<T>(expression);
public static object Evaluate(string expression, Variable variable)
var interpreter = new Interpreter().SetVariable(variable);
return interpreter.Eval(expression);
public static object Evaluate(string expression, List<Variable> variables)
var interpreter = new Interpreter().SetVariables(variables);
return interpreter.Eval(expression);
public static object Parse(string expression, Variable variable)
var interpreter = new Interpreter().SetVariable(variable);
var parsedExpression = interpreter.Parse(expression);
return parsedExpression.Invoke();
public static object Parse(string expression, List<Variable> variables)
var interpreter = new Interpreter().SetVariables(variables);
var parsedExpression = interpreter.Parse(expression);
return parsedExpression.Invoke();
internal static class InterpreterExtensions
internal static Interpreter SetVariables(this Interpreter interpreter, List<Variable> variables)
variables.ForEach(v => interpreter.SetVariable(v));
internal static Interpreter SetVariable(this Interpreter interpreter, Variable variable)
interpreter.SetVariable(variable.Name, variable.Value);
public static class ObjectExtensions
public static ExpandoObject Merge(this object obj, params object[] objects)
var expando = obj.ToExpandoObject();
foreach (var o in objects)
foreach (var p in o.GetType().GetProperties())
(expando as IDictionary<string, dynamic>)[p.Name] = p.GetValue(o);
public static ExpandoObject Merge(this object obj, params IDictionary<string, dynamic>[] objects)
var expando = obj.ToExpandoObject();
foreach(var dic in objects)
(expando as IDictionary<string, dynamic>)[kvp.Key.FormatToParameter()] = kvp.Value;
public static ExpandoObject Merge(this object obj, DataRow[] rows)
var expando = obj.ToExpandoObject();
foreach(DataRow r in rows)
foreach (DataColumn c in r.Table.Columns)
(expando as IDictionary<string, dynamic>)[c.ColumnName] = r.Field<dynamic>(c.ColumnName);
public static ExpandoObject ToExpandoObject(this object obj)
if(obj is IDictionary<string, dynamic>)
return ((IDictionary<string, dynamic>)obj).DictionaryToExpandoObject();
var expando = new ExpandoObject();
foreach (var p in obj.GetType().GetProperties())
(expando as IDictionary<string, dynamic>)[p.Name] = p.GetValue(obj);
public static ExpandoObject ToExpandoObject(this DataRow row)
var expando = new ExpandoObject();
foreach (DataColumn c in row.Table.Columns)
(expando as IDictionary<string, dynamic>)[c.ColumnName] = row.Field<dynamic>(c.ColumnName);
private static ExpandoObject DictionaryToExpandoObject(this IDictionary<string, dynamic> dictionary)
var expando = new ExpandoObject();
foreach (var kvp in dictionary)
(expando as IDictionary<string, dynamic>)[kvp.Key] = kvp.Value;
private static string FormatToParameter(this string source, string regex = "[^a-z0-9_]")
var str = Regex.Replace(source, regex, "", RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(100));
while (str != null && str.Length > 0 && str[0] >= '0' && str[0] <= '9')
public string Name { get; set; }
public dynamic Value { get; set; }
public static void Main()
var dic = new Dictionary<string, dynamic>
var dic2 = new Dictionary<string, dynamic>
var obj = dic.ToExpandoObject();
var obj2 = dic2.ToExpandoObject();
var result = DynamicExpression.Evaluate<double>("T.x + T2.y", new List<Variable>
Console.WriteLine(result);