ServiceMap.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace FlutterCodeGenerator
  6. {
  7. internal class ServiceMap
  8. {
  9. public List<MethodMap> MethodMapList;
  10. public static List<ComplexModelType> TemporaryList { get; set; }
  11. private List<ComplexModelType> _usedComplexModelTypeList;
  12. private List<string> _userDefinedComplexReturnTypeList;
  13. private string _serviceName;
  14. public ServiceMap(Type type)
  15. {
  16. _usedComplexModelTypeList = new List<ComplexModelType>();
  17. TemporaryList = new List<ComplexModelType>();
  18. MethodMapList = new List<MethodMap>();
  19. var methodsList = type.GetMethods();
  20. _serviceName = type.Name[1..];
  21. foreach (var method in methodsList)
  22. {
  23. var methodMap = new MethodMap(method);
  24. MethodMapList.Add(methodMap);
  25. }
  26. _usedComplexModelTypeList.AddRange(TemporaryList);
  27. }
  28. public string GetServiceModelDartString()
  29. {
  30. var dartString = new StringBuilder();
  31. foreach (var modelType in _usedComplexModelTypeList)
  32. {
  33. dartString.AppendLine(modelType.GetDartString());
  34. }
  35. if (string.IsNullOrWhiteSpace(dartString.ToString()))
  36. {
  37. return null;
  38. }
  39. var serviceModelDartString = new StringBuilder();
  40. if (dartString.ToString().Contains("FJsonConvert"))
  41. {
  42. serviceModelDartString.AppendLine(CodeGenerator.StringJsonConvert);
  43. serviceModelDartString.AppendLine();
  44. }
  45. serviceModelDartString.AppendLine(dartString.ToString());
  46. return serviceModelDartString.ToString();
  47. }
  48. public string GetServiceDartString()
  49. {
  50. var serviceDartString = new StringBuilder();
  51. serviceDartString.AppendLine($"class {_serviceName} extends JsonRpcClientBase {{");
  52. serviceDartString.AppendLine($"\t{_serviceName}(");
  53. serviceDartString.AppendLine("\t\tString host, {");
  54. serviceDartString.AppendLine($"\t\tString serviceName = \"I{_serviceName}\",");
  55. serviceDartString.AppendLine("\t\tMap<String, String>? headers,");
  56. serviceDartString.AppendLine("\t\tint? timeout,");
  57. serviceDartString.AppendLine("\t}) : super(");
  58. serviceDartString.AppendLine("\t\t\t\t\t\thost,");
  59. serviceDartString.AppendLine("\t\t\t\t\t\tserviceName,");
  60. serviceDartString.AppendLine("\t\t\t\t\t\theaders: headers,");
  61. serviceDartString.AppendLine("\t\t\t\t\t\ttimeout: timeout,");
  62. var complexReturnTypeNameList = GetUserDefinedComplexReturnTypeList();
  63. if (complexReturnTypeNameList.Count() == 0)
  64. {
  65. serviceDartString.AppendLine("\t\t\t\t);");
  66. }
  67. else
  68. {
  69. serviceDartString.AppendLine("\t\t\t\t) {");
  70. serviceDartString.AppendLine("\t\t/// 注册响应实体反序列化处理器");
  71. foreach (var complexRetrunTypeName in complexReturnTypeNameList)
  72. {
  73. serviceDartString.AppendLine($"\t\tFJsonConvert.setDecoder((map) => {complexRetrunTypeName}.fromJson(map));");
  74. }
  75. serviceDartString.AppendLine("\t}");
  76. }
  77. serviceDartString.AppendLine();
  78. foreach (var methodMap in MethodMapList)
  79. {
  80. serviceDartString.AppendLine(methodMap.GetMethodDartString());
  81. }
  82. serviceDartString.AppendLine("}");
  83. return serviceDartString.ToString();
  84. }
  85. public List<string> GetUserDefinedComplexReturnTypeList()
  86. {
  87. _userDefinedComplexReturnTypeList = new List<string>();
  88. foreach (var method in MethodMapList)
  89. {
  90. var veturnParameterModelType = method.ReturnParameterModelType;
  91. AddUserDefinedComplexReturnType(veturnParameterModelType);
  92. }
  93. return _userDefinedComplexReturnTypeList;
  94. }
  95. private void AddUserDefinedComplexReturnType(ModelType modelType)
  96. {
  97. if (modelType is UserDefinedComplexModeType)
  98. {
  99. if (!_userDefinedComplexReturnTypeList.Contains(modelType.GetFlutterTypeName()))
  100. {
  101. _userDefinedComplexReturnTypeList.Add(modelType.GetFlutterTypeName());
  102. }
  103. }
  104. else if (modelType is UserDefinedGenericComplexModelType userDefinedGenericComplexModelType)
  105. {
  106. if (!_userDefinedComplexReturnTypeList.Contains(userDefinedGenericComplexModelType.GetFlutterTypeName()))
  107. {
  108. _userDefinedComplexReturnTypeList.Add(userDefinedGenericComplexModelType.GetFlutterTypeName());
  109. }
  110. var argumentModelType = userDefinedGenericComplexModelType.GenericArgumentModelType;
  111. AddUserDefinedComplexReturnType(argumentModelType);
  112. }
  113. else if (modelType is ListModelType listModelType)
  114. {
  115. var argumentModelType = listModelType.GenericArgumentModelType;
  116. AddUserDefinedComplexReturnType(argumentModelType);
  117. }
  118. else if (modelType is DictionaryModelType dictionaryModelType)
  119. {
  120. foreach (var argumentModelType in dictionaryModelType.GenericArgumentModelTypeList)
  121. {
  122. AddUserDefinedComplexReturnType(argumentModelType);
  123. }
  124. }
  125. }
  126. }
  127. }