Advertisement
sharewithkinjal

CSharpEval with dynamic member invokes

Aug 28th, 2014
304
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.61 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Dynamic;
  6. using ExpressionEvaluator;
  7.  
  8. namespace TestConsoleApp.CSharpEval
  9. {
  10.     public class RuleHolder
  11.     {
  12.         protected Dictionary<string, Func<object, object>> elements = new Dictionary<string, Func<object, object>>(StringComparer.InvariantCultureIgnoreCase);
  13.  
  14.         public void AddRule(string rulename, string expression)
  15.         {
  16.             elements[rulename] = new CompiledExpression(expression).ScopeCompile();
  17.         }
  18.  
  19.         public object this[string rulename]
  20.         {
  21.             get
  22.             {
  23.                 return elements[rulename];
  24.             }
  25.             set
  26.             {
  27.                 elements[rulename] = CreateScopedExpression(value.ToString());
  28.             }
  29.         }
  30.  
  31.         protected Func<object, object> CreateScopedExpression(string expression)
  32.         {
  33.             var expr = new CompiledExpression(expression);
  34.             return expr.ScopeCompile();
  35.         }
  36.  
  37.         public RuleHolder()
  38.         {
  39.             // In production, this will be fetched from the database
  40.             elements["Basic"] = CreateScopedExpression("seed * 2.0");
  41.             elements["Bonus"] = CreateScopedExpression("basic + (basic * 0.1)");
  42.             elements["Nested"] = CreateScopedExpression("blah.A + Bonus");
  43.         }
  44.  
  45.     }
  46.  
  47.     public class BaseScope : DynamicObject
  48.     {
  49.         protected RuleHolder _rules;
  50.         protected Dictionary<string, object> _members;
  51.  
  52.         public BaseScope(RuleHolder rules, Dictionary<string, object> members = null, List<string> rulemembers = null)
  53.         {
  54.             _rules = rules;
  55.             if (members == null)
  56.             {
  57.                 _members = new Dictionary<string, object>(StringComparer.InvariantCultureIgnoreCase);
  58.             }
  59.             else
  60.             {
  61.                 _members = members;
  62.             }
  63.  
  64.             // Add all formula based elements
  65.             foreach (var item in rulemembers)
  66.             {
  67.                 _members[item] = null;
  68.             }
  69.         }
  70.  
  71.         protected Func<object, object> GetExpressionDelegate(string membername)
  72.         {
  73.             Func<object, object> member = null;
  74.             if (_members.ContainsKey(membername))
  75.             {
  76.                 member = _rules[membername] as Func<object, object>;
  77.  
  78.             }
  79.             return member;
  80.         }
  81.  
  82.         public override bool TrySetMember(SetMemberBinder binder, object value)
  83.         {
  84.             _members[binder.Name] = value;
  85.             return true;
  86.         }
  87.  
  88.         public override bool TryGetMember(GetMemberBinder binder, out object result)
  89.         {
  90.             if (_members.ContainsKey(binder.Name))
  91.             {
  92.                 var member = _members[binder.Name];
  93.                 if (member == null)
  94.                 {
  95.                     member = GetExpressionDelegate(binder.Name);
  96.                     if (member != null)
  97.                     {
  98.                         result = (double)((Func<object, object>)member)(this);
  99.                         return true;
  100.                     }
  101.                     else
  102.                     {
  103.                         result = null;
  104.                         return false;
  105.                     }
  106.                 }
  107.                 else
  108.                 {
  109.                     result = member;
  110.                     return true;
  111.                 }
  112.             }
  113.             else
  114.             {
  115.                 return base.TryGetMember(binder, out result);
  116.             }
  117.         }
  118.     }
  119.  
  120.     public static class CSEvalDemo2
  121.     {
  122.         public static void MainStarted(string[] args)
  123.         {
  124.             TestBaseScope();
  125.         }
  126.         protected static void TestBaseScope()
  127.         {
  128.             RuleHolder holder = new RuleHolder();
  129.             List<string> members = new List<string>() { "BASIC", "BONUS", "Nested" };
  130.             dynamic sc = new BaseScope(holder, rulemembers: members);
  131.  
  132.             sc.seed = 10d;
  133.             Console.WriteLine("Original seed:" + sc.seed);
  134.             Console.WriteLine("Basic => " + sc.Basic);
  135.             Console.WriteLine("Bonus => " + sc.Bonus);
  136.  
  137.             sc.seed = 100d;
  138.             sc.Blah = new ExpandoObject();
  139.             sc.Blah.A = 400d;
  140.             Console.WriteLine("After Change seed:" + sc.seed);
  141.             Console.WriteLine("Basic => " + sc.Basic);
  142.             Console.WriteLine("Bonus => " + sc.Bonus);
  143.             Console.WriteLine("Blah.A => " + sc.Nested);
  144.  
  145.             sc.seed = 400d;
  146.             Console.WriteLine("Blah.A => " + sc.Nested);
  147.         }
  148.     }
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement