Ejemplo n.º 1
0
        public void TestExpression()
        {
            var name     = new AssemblyName("TestAssembly");
            var assembly = AssemblyBuilder.DefineDynamicAssembly(name, AssemblyBuilderAccess.Run);

            var module = assembly.DefineDynamicModule("TestAssembly.dll");

            var myClass  = module.DefineType("MyClass");
            var myField  = myClass.DefineField("MyField", typeof(long), FieldAttributes.Public);
            var myMethod = myClass.DefineMethod("MyMethod", MethodAttributes.Public, CallingConventions.HasThis, typeof(long), new Type[0]);

            var expression = new Expression.Operation.Binary()
            {
                LeftOperand  = new Expression.Parameter("Input"),
                RightOperand = new Expression.Literal(10000),
                Operator     = new Syntax.Operator.Numerical.Addition()
            };

            var state = new ExpressionWriter.State()
            {
                FieldByName = new Dictionary <string, FieldInfo>()
                {
                    ["Input"] = myField
                },
                ArgumentsByName = new Dictionary <string, int>()
            };


            var generator = myMethod.GetILGenerator();
            var writer    = new ExpressionWriter(generator, state);

            writer.WriteExpression(expression);
            generator.Emit(OpCodes.Ret);

            var myClassInfo  = myClass.CreateType();
            var myFieldInfo  = myClass.GetField("MyField");
            var myMethodInfo = myClassInfo.GetMethods()[0];

            var myClassInstance = Activator.CreateInstance(myClass);

            myFieldInfo.SetValue(myClassInstance, 3);
            var output = myMethodInfo.Invoke(myClassInstance, new object[0]);

            Assert.AreEqual(output, 10003);
        }