Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Dynamic;
- using ExpressionEvaluator;
- namespace TestConsoleApp.CSharpEval
- {
- public class RuleHolder
- {
- protected Dictionary<string, Func<object, object>> elements = new Dictionary<string, Func<object, object>>(StringComparer.InvariantCultureIgnoreCase);
- public void AddRule(string rulename, string expression)
- {
- elements[rulename] = new CompiledExpression(expression).ScopeCompile();
- }
- public object this[string rulename]
- {
- get
- {
- return elements[rulename];
- }
- set
- {
- elements[rulename] = CreateScopedExpression(value.ToString());
- }
- }
- protected Func<object, object> CreateScopedExpression(string expression)
- {
- var expr = new CompiledExpression(expression);
- return expr.ScopeCompile();
- }
- public RuleHolder()
- {
- // In production, this will be fetched from the database
- elements["Basic"] = CreateScopedExpression("seed * 2.0");
- elements["Bonus"] = CreateScopedExpression("basic + (basic * 0.1)");
- elements["Nested"] = CreateScopedExpression("blah.A + Bonus");
- }
- }
- public class BaseScope : DynamicObject
- {
- protected RuleHolder _rules;
- protected Dictionary<string, object> _members;
- public BaseScope(RuleHolder rules, Dictionary<string, object> members = null, List<string> rulemembers = null)
- {
- _rules = rules;
- if (members == null)
- {
- _members = new Dictionary<string, object>(StringComparer.InvariantCultureIgnoreCase);
- }
- else
- {
- _members = members;
- }
- // Add all formula based elements
- foreach (var item in rulemembers)
- {
- _members[item] = null;
- }
- }
- protected Func<object, object> GetExpressionDelegate(string membername)
- {
- Func<object, object> member = null;
- if (_members.ContainsKey(membername))
- {
- member = _rules[membername] as Func<object, object>;
- }
- return member;
- }
- public override bool TrySetMember(SetMemberBinder binder, object value)
- {
- _members[binder.Name] = value;
- return true;
- }
- public override bool TryGetMember(GetMemberBinder binder, out object result)
- {
- if (_members.ContainsKey(binder.Name))
- {
- var member = _members[binder.Name];
- if (member == null)
- {
- member = GetExpressionDelegate(binder.Name);
- if (member != null)
- {
- result = (double)((Func<object, object>)member)(this);
- return true;
- }
- else
- {
- result = null;
- return false;
- }
- }
- else
- {
- result = member;
- return true;
- }
- }
- else
- {
- return base.TryGetMember(binder, out result);
- }
- }
- }
- public static class CSEvalDemo2
- {
- public static void MainStarted(string[] args)
- {
- TestBaseScope();
- }
- protected static void TestBaseScope()
- {
- RuleHolder holder = new RuleHolder();
- List<string> members = new List<string>() { "BASIC", "BONUS", "Nested" };
- dynamic sc = new BaseScope(holder, rulemembers: members);
- sc.seed = 10d;
- Console.WriteLine("Original seed:" + sc.seed);
- Console.WriteLine("Basic => " + sc.Basic);
- Console.WriteLine("Bonus => " + sc.Bonus);
- sc.seed = 100d;
- sc.Blah = new ExpandoObject();
- sc.Blah.A = 400d;
- Console.WriteLine("After Change seed:" + sc.seed);
- Console.WriteLine("Basic => " + sc.Basic);
- Console.WriteLine("Bonus => " + sc.Bonus);
- Console.WriteLine("Blah.A => " + sc.Nested);
- sc.seed = 400d;
- Console.WriteLine("Blah.A => " + sc.Nested);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement