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); }
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(); }