Esempio n. 1
0
        static void AddMember(ExpressionContext ctx, Type type)
        {
            BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.InvokeMethod | BindingFlags.GetProperty | BindingFlags.GetField;

            foreach (var m in type.GetMembers(bindingFlags))
            {
                var    attr = m.GetCustomAttribute <ExportMemberAttribute>();
                string name = string.IsNullOrEmpty(attr.Name) ? m.Name : attr.Name;
                if (m is MethodInfo)
                {
                    ctx.AddVariable(typeof(MethodInfo), name);
                    ctx.SetVariable(name, m);
                }
                else if (m is FieldInfo)
                {
                    var fInfo = (FieldInfo)m;
                    ctx.AddVariable(fInfo.FieldType, name);
                    ctx.SetVariable(name, fInfo.GetValue(null));
                }
                else if (m is PropertyInfo)
                {
                    var pInfo = (PropertyInfo)m;
                    ctx.AddVariable(pInfo.PropertyType, name);
                    ctx.SetVariable(name, pInfo.GetGetMethod().Invoke(null, null));
                }
            }
        }
Esempio n. 2
0
        public void Block_SetVariable2()
        {
            var ctx = new ExpressionContext();

            ctx.AddVariable <int>("int1", 1);
            var int2 = Variable <int>("int2");
            var int3 = Variable <int>("int3");
            var expr = Block(
                new ParameterExpression[] { int2 },
                new Expression[] {
                Assign(int2, Constant(2)),
                Block(new ParameterExpression[] { int3 },
                      new Expression[] {
                    Assign(int3, Constant(3)),
                    Assign(Variable <int>("int1"), Add(int2, int3))
                })
            });
            //System.Linq.Expressions.Expression
            var result = Eval(expr, ctx);

            Assert.IsTrue(ctx.ContainsVariable("int1"));
            Assert.IsFalse(ctx.ContainsVariable("int2"));
            Assert.IsFalse(ctx.ContainsVariable("int3"));
            Assert.AreEqual(5, ctx.GetVariable("int1"));
            Assert.AreEqual(null, result);
        }
Esempio n. 3
0
        public void MethodCall_Overload()
        {
            var ctx = new ExpressionContext();

            var obj     = new MethodClass();
            var objType = obj.GetType();

            ctx.AddVariable <MethodClass>("target", obj);
            var varTarget = Variable(objType, "target");
            var result    = Eval(new Dictionary <string, object>()
            {
                { "target", obj }
            },
                                 Call(varTarget, "OverloadMethod", Constant(1)), ctx);

            Assert.AreEqual(1, result);

            result = Eval(new Dictionary <string, object>()
            {
                { "target", obj }
            },
                          Call(varTarget, "OverloadMethod", Constant("hello world")), ctx);

            Assert.AreEqual("hello world", result);
        }
Esempio n. 4
0
        public void Block_SetVariable()
        {
            var int1 = Variable <int>("int1");
            var int2 = Variable <int>("int2");

            var expr = Block(
                new ParameterExpression[] {
                int2
            },
                new Expression[] {
                Assign(int2, Constant(2)),
                Assign(int1, int2)
            });

            var ctx = new ExpressionContext();

            ctx.AddVariable <int>("int1", 1);

            var result = Eval(expr, ctx);

            Assert.IsTrue(ctx.ContainsVariable("int1"));
            Assert.IsFalse(ctx.ContainsVariable("int2"));
            Assert.AreEqual(2, ctx.GetVariable("int1"));
            Assert.AreEqual(null, result);
        }
Esempio n. 5
0
        public void Logic()
        {
            CheckExpr("1<2", true);
            CheckExpr("2<1", false);
            CheckExpr("1<=2", true);
            CheckExpr("2<=1", false);
            CheckExpr("2>1", true);
            CheckExpr("1>2", false);
            CheckExpr("2>=1", true);
            CheckExpr("1>=2", false);
            CheckExpr("1==1", true);
            CheckExpr("1==2", false);
            CheckExpr("1!=2", true);
            CheckExpr("1!=1", false);

            ExpressionContext ctx = new ExpressionContext();

            ctx.AddVariable <int>("a");
            ctx.SetVariable("a", 1);
            CheckExpr("a==1", true, ctx);

            ctx = new ExpressionContext();
            ctx.AddVariable <float>("a");
            ctx.SetVariable("a", 1.1f);
            CheckExpr("a==1.1", true, ctx);
        }
Esempio n. 6
0
        private void TestVariable(string name, object value)
        {
            var ctx = new ExpressionContext();

            ctx.AddVariable(value.GetType(), name, value);
            Assert.IsTrue(ctx.ContainsVariable(name));
            Assert.IsFalse(ctx.ContainsVariable("_" + name));
            Assert.AreEqual(value, ctx.GetVariable(name));
        }
Esempio n. 7
0
        public void Call_Static()
        {
            ExpressionContext ctx = new ExpressionContext();

            ctx.AddVariable <MethodInfo>("Static_Add");
            var mInfo = typeof(MyClass).GetMethod("Static_Add", BindingFlags.Public | BindingFlags.Static);

            ctx.SetVariable("Static_Add", mInfo);
            CheckExpr("Static_Add(1,2)", 3L, ctx);
        }
Esempio n. 8
0
        public void Call_()
        {
            var dt  = DateTime.Parse("1/2/2017 03:04:05");
            var sss = dt.ToString();
            ExpressionContext ctx = new ExpressionContext();

            ctx.AddVariable(typeof(TestClass), "instance", new TestClass());
            CompileContext compile = new CompileContext();

            compile.AddVariable(typeof(TestClass), "instance");
            Run(Resource1.call, compile, ctx);
        }
Esempio n. 9
0
        public void Call_InstanceMethod()
        {
            var varObj  = Variable <CallClass>("obj");
            var expr    = Call(varObj, "Hello");
            var compile = new CompileContext();
            var ctx     = new ExpressionContext();

            ctx.AddVariable <CallClass>("obj", new CallClass());

            var result = compile.Compile(expr)(ctx);

            Assert.AreEqual("Instance: Hello World", result);
        }
Esempio n. 10
0
        public void TestInstanceFunc()
        {
            object            result;
            MyObj             obj = new MyObj(1);
            ExpressionContext ctx = new ExpressionContext();

            ctx.AddVariable <Func <long, long> >("add");
            ctx.SetVariable("add", new Func <long, long>(obj.Add));
            CompileContext comple = new CompileContext(ctx);
            var            expr   = ScriptExpressionReader.Instance.Parse("add(2)", comple);

            result = comple.Compile(expr)(ctx);
            Assert.AreEqual(result, 3L);
        }
Esempio n. 11
0
        public void Call()
        {
            ExpressionContext ctx = new ExpressionContext();

            ctx.AddVariable <MyClass>("obj");
            ctx.SetVariable("obj", new MyClass()
            {
            });
            CheckExpr("obj.Negate(1)", -1L, ctx);
            CheckExpr("obj.Add(1,2)", 3L, ctx);
            CheckExpr("obj.Add_ABC(1,2,3)", 6L, ctx);
            //  CheckExpr("obj.Sum_Params(1,2,3)", 6L, ctx);
            CheckExpr("obj.Add(1,2)+obj.Add(3,4)", 10L, ctx);
        }
Esempio n. 12
0
        public void Call_DelegateArgs1()
        {
            var varObj  = Variable <string>("del");
            var expr    = Call(varObj, typeof(string), Constant("My"));
            var compile = new CompileContext();
            var ctx     = new ExpressionContext();

            ctx.AddVariable("del", new Func <string, string>((say) =>
            {
                return(say + ": Hello World");
            }));

            var result = compile.Compile(expr)(ctx);

            Assert.AreEqual("My: Hello World", result);
        }
Esempio n. 13
0
        public void Func_Var_Nest_Func()
        {
            var varI     = Variable <int>("i");
            var funcExpr = Function("func_i", Block(new ParameterExpression[] { varI },
                                                    Assign(varI, Constant(2)),
                                                    Return(Call(Function(null, Return(varI), typeof(int)), typeof(int)))), typeof(int));
            var compile = new CompileContext();

            //using (compile.BeginScope())
            //{
            compile.AddVariable <int>("i");
            var tmp = compile.Compile(Call(funcExpr, typeof(int)));
            var ctx = new ExpressionContext();

            ctx.AddVariable <int>("i", 1);
            var result = tmp(ctx);

            Assert.AreEqual(2, result);
            //}
        }
Esempio n. 14
0
        public void Member()
        {
            ExpressionContext ctx = new ExpressionContext();

            ctx.AddVariable <MyClass>("obj");
            ctx.SetVariable("obj", new MyClass()
            {
                IntField    = 1,
                IntProperty = 2,
                Next        = new MyClass()
                {
                    IntField    = 3,
                    IntProperty = 4,
                }
            });
            CheckExpr("obj.IntField", 1, ctx);
            CheckExpr("obj.IntProperty", 2, ctx);
            CheckExpr("obj.Next.IntField", 3, ctx);
            CheckExpr("obj.Next.IntProperty", 4, ctx);
        }
Esempio n. 15
0
        public void Type_Convert()
        {
            MyValue my    = new MyValue("a");
            string  myStr = my;

            Assert.AreEqual("a", myStr);
            my = myStr;
            Assert.AreEqual("a", my.Value);

            MyValue2 my2 = new MyValue2("a2");

            myStr = my2;
            //my2 = myStr;//can't convert
            Assert.AreEqual("a2", myStr);
            MyValue3 my3 = myStr;

            myStr = my3;



            Func <object, Type, object> convert = (value, toType) =>
            {
                Type fromType = value.GetType();
                InvocationDelegate eval;
                var compile = new CompileContext();

                compile.OverrideOperator(typeof(MyValue));
                compile.AddVariable(fromType, "a");
                using (compile.BeginScope())
                {
                    var expr = Convert(Variable(fromType, "a"), toType);

                    eval = compile.Compile(expr);
                }

                ExpressionContext ctx = new ExpressionContext();
                ctx.AddVariable(fromType, "a");
                ctx.SetVariable("a", value);
                return(eval(ctx));
            };

            object result;

            result = convert(new MyValue("Hello World"), typeof(string));
            Assert.AreEqual("Hello World", result);

            result = convert("Hello World", typeof(MyValue));
            Assert.AreEqual("Hello World", ((MyValue)result).Value);

            result = convert(new MyValue2("Hello World"), typeof(string));
            Assert.AreEqual("Hello World", result);

            try
            {
                result = convert("Hello World", typeof(MyValue2));
                Assert.AreEqual("Hello World", ((MyValue2)result).Value);
                Assert.Fail();
            }
            catch (OperatorNotImplementedException ex) { }

            result = convert(new MyValue3("Hello World"), typeof(string));
            Assert.AreEqual("Hello World", result);

            result = convert("Hello World", typeof(MyValue3));
            Assert.AreEqual("Hello World", ((MyValue3)result).Value);
        }