public async Task Generate_WithReturnValue(string userFuncName, Type generatedMethodReturnType, string expectedResult)
        {
            var userFunc = this.GetType().GetMethod(userFuncName, BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);

            string functionName = "FunctionWithStrReturn";
            Collection <ParameterDescriptor> parameters = new Collection <ParameterDescriptor>();

            var userRetType = userFunc.ReturnType;
            ParameterDescriptor returnParameter;

            if (DotNetFunctionDescriptorProvider.TryCreateReturnValueParameterDescriptor(userRetType, new FunctionBinding[0], out returnParameter))
            {
                parameters.Add(returnParameter);
            }

            FunctionMetadata metadata = new FunctionMetadata();
            var invoker = new RealInvoker(userFunc);
            FunctionDescriptor function = new FunctionDescriptor(functionName, invoker, metadata, parameters, null, null, null);
            Collection <FunctionDescriptor> functions = new Collection <FunctionDescriptor>();

            functions.Add(function);

            // generate the Type
            Type functionType = FunctionGenerator.Generate("TestScriptHost", "TestFunctions", null, functions);

            // verify the generated function
            MethodInfo method = functionType.GetMethod(functionName);
            IEnumerable <Attribute> attributes = functionType.GetCustomAttributes();

            Assert.Empty(attributes);
            ParameterInfo[] functionParams = method.GetParameters();

            // One input parameter
            Assert.Equal(0, functionParams.Length);

            // The final generated function is always Task
            Assert.Equal(generatedMethodReturnType, method.ReturnType);

            // Verify that the method is invocable
            var result = method.Invoke(null, new object[] { });

            Task <object> taskResult = Unwrap(result);
            var           realResult = await taskResult;

            Assert.Equal(expectedResult, realResult);
        }
Example #2
0
        public static void Used()
        {
            //构建 命令主体
            var add = new Add();
            var del = new Del();

            //设置命令执行参数主体
            add.Receiver = new SqlServerDB();
            del.Receiver = new OracleDB();
            //构建命令执行者
            var real = new RealInvoker();

            //将命令添加到执行者
            real.AddCmd(add);
            real.AddCmd(del);
            //执行命令
            real.Invoke();
            real.RollBack();
        }