private IEnumerable <string> GenerateMethod(short methodID, System.Reflection.MethodInfo method) { if (method.IsIndexer()) { throw new NotSupportedException("Indexer unsupported, use setter/getter instead"); } var codeLines = new List <string>(); if (method.IsSynchronized()) { codeLines.Add($"public {method.ReturnName()} {method.Name}("); } else { codeLines.Add($"public async {method.ReturnName()} {method.Name}("); } var isFirstParam = true; foreach (var p in method.GetParameters()) { var paramDeclare = $"{p.ParameterType.CompilableClassName()} {p.Name}"; if (!isFirstParam) { codeLines.Add($", {paramDeclare}"); } else { codeLines.Add(paramDeclare); } isFirstParam = false; } codeLines.Add("){"); if (OutputDebug) { var msg = $"proxy: call {method.Name} id={methodID}"; codeLines.Add($"System.Console.WriteLine(\"{msg}\");"); } codeLines.Add("var stream = new MemoryStream();"); codeLines.Add("var serializer = new Serializer(stream);"); foreach (var p in method.GetParameters()) { if (p.ParameterType.IsInterface) { codeLines.Add($"if ({p.Name} == null)"); codeLines.Add("{"); codeLines.Add("serializer.Serialize<Int16>(-1);"); codeLines.Add("} else {"); codeLines.Add($"var objectID = _proxyItem.CacheService({p.Name});"); codeLines.Add("serializer.Serialize<Int16>(objectID);"); codeLines.Add("}"); } else { codeLines.Add(SerializeStatement.SerializeObject(p.ParameterType, p.Name)); } } codeLines.Add("stream.Seek(0, SeekOrigin.Begin);"); if (method.IsSynchronized()) { codeLines.Add($"var response = _proxyItem.SendCallRequest({methodID}, stream.ToArray());"); } else { codeLines.Add($"var response = await _proxyItem.SendCallRequestAsync({methodID}, stream.ToArray());"); } if (!method.ReturnType.IsVoid() && !method.ReturnType.IsTask()) { codeLines.Add("serializer = new Serializer(response);"); if (method.ReturnType.IsGenericTask()) { var returnType = method.ReturnType.GetGenericArguments()[0]; codeLines.Add($"return {SerializeStatement.DeserializeObject(returnType)}"); } else if (method.ReturnType.IsInterface) { codeLines.Add("var returnObjectID = serializer.Deserialize<Int16>();"); var nonNull = $"_proxyItem.CacheProxy<{method.ReturnType.CompilableClassName()}>(returnObjectID)"; codeLines.Add($"return returnObjectID >= 0 ? {nonNull} : null;"); } else { var returnType = method.ReturnType; codeLines.Add($"return {SerializeStatement.DeserializeObject(returnType)}"); } } codeLines.Add("}"); return(codeLines); }
private IEnumerable <string> GenerateMethodCall(MethodInfo method, Int16 methodID) { if (method.IsIndexer()) { throw new NotSupportedException("Indexer unsupported, use setter/getter instead"); } var codeLines = new List <string>(); //the method signature if (method.IsSynchronized()) { codeLines.Add($"private Task {GeneratedMethodCallName(method, methodID)}(Stream dataStream, MemoryStream resultStream)"); } else { codeLines.Add($"private async Task {GeneratedMethodCallName(method, methodID)}(Stream dataStream, MemoryStream resultStream)"); } codeLines.Add("{"); if (OutputDebug) { var msg = $"stub: call {method.Name} id={methodID}"; codeLines.Add($"System.Console.WriteLine(\"{msg}\");"); } //deserialize the parameters codeLines.Add("var serializer = new Serializer(dataStream);"); foreach (var p in method.GetParameters()) { if (p.ParameterType.IsInterface) { var id_name = $"{p.Name}_objectID"; codeLines.Add($"var {id_name} = serializer.Deserialize<Int16>();"); var nonNull = $"_serviceItem.CacheProxy<{p.ParameterType.CompilableClassName()}>({id_name})"; codeLines.Add($"{p.ParameterType.CompilableClassName()} {p.Name} = {id_name} < 0 ? null : {nonNull} ;"); } else { codeLines.Add($"var {p.Name} = {SerializeStatement.DeserializeObject(p.ParameterType)}"); } } //call the service object if (method.ReturnType.IsVoid()) { codeLines.Add($"_service.{method.Name}("); } else if (method.ReturnType.IsTask()) { codeLines.Add($"await _service.{method.Name}("); } else if (method.ReturnType.IsGenericTask()) { codeLines.Add($"var result = await _service.{method.Name}("); } else { codeLines.Add($"var result = _service.{method.Name}("); } //pass the parameters var isFirstParam = true; foreach (var p in method.GetParameters()) { if (isFirstParam) { isFirstParam = false; } else { codeLines.Add(", "); } codeLines.Add($"{p.Name}:{p.Name}"); } codeLines.Add(");"); //serialize the returns to result stream if (!method.ReturnType.IsVoid() && !method.ReturnType.IsTask()) { codeLines.Add("serializer = new Serializer(resultStream);"); var resultType = method.ReturnType; if (method.ReturnType.IsInterface) { codeLines.Add("if (result == null) {"); codeLines.Add("serializer.Serialize<Int16>(-1);"); codeLines.Add("} else {"); codeLines.Add($"var resultObjectID = _serviceItem.CacheService<{method.ReturnType.CompilableClassName()}>(result);"); codeLines.Add("serializer.Serialize<Int16>(resultObjectID);"); codeLines.Add("}"); } else { if (method.ReturnType.IsGenericTask()) { resultType = resultType.GetGenericArguments()[0]; } codeLines.Add(SerializeStatement.SerializeObject(resultType, "result")); } } if (method.IsSynchronized()) { codeLines.Add("return Task.CompletedTask;"); } codeLines.Add("}"); return(codeLines); }