public override void Compile(CompileContext context)
 {
     MethodInfo newMethod = context.GetMethod(_methodName);
     base.OverridePreProcess(context, newMethod);
 }
        public override void Compile(CompileContext context)
        {
            Type[] argtypes = GetArgTypes();

            if (_method == null) {
                _method = context.GetMethod(_methodName, argtypes);
            }

            if (_instance != null) {
                _instance.Compile(context);
            }

            ParameterInfo[] actualParams = _method.GetParameters();
            for (int i = 0 ; i< ChildNodes.Count; i++) {
                Expression exp = (Expression)ChildNodes[i];
                exp.Compile(context);
                if (exp.Type.Equals(typeof(int))
                    && actualParams[i].ParameterType.Equals(typeof(object))) {
                    context.ILGenerator.Emit(OpCodes.Box, typeof(int));
                }
                if (exp is Variable) {
                    context.ILGenerator.Emit(OpCodes.Unbox_Any, typeof(int));
                }
            }

            if (_method.IsVirtual) {
                context.ILGenerator.Emit(OpCodes.Callvirt, _method);
            } else {
                context.ILGenerator.Emit(OpCodes.Call, _method);
            }
            if (PopReturnValue && _method.ReturnType != typeof(void)) {
                context.ILGenerator.Emit(OpCodes.Pop);
            }
        }