MethodMap.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. using FlutterCodeGenerator.Helper;
  2. using FlutterCodeGenerator.Model;
  3. using FlutterCodeGenerator.ModelTypes;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Data;
  7. using System.Linq;
  8. using System.Reflection;
  9. using System.Text;
  10. namespace FlutterCodeGenerator.Map
  11. {
  12. internal class MethodMap
  13. {
  14. public List<ModelType> ParameterModelTypes;
  15. public ModelType ReturnParameterModelType { get; set; }
  16. public string MethodName { get; private set; }
  17. public MethodMap(MethodInfo method)
  18. {
  19. MethodName = method.Name;
  20. GenerateDataCache.Instance.CurrentMethod = MethodName;
  21. ParameterModelTypes = new List<ModelType>();
  22. Type returnParameterType;
  23. if (method.ReturnType.Name != "Task`1")
  24. {
  25. returnParameterType = method.ReturnType;
  26. }
  27. else
  28. {
  29. returnParameterType = method.ReturnType.GetGenericArguments()[0];
  30. }
  31. ReturnParameterModelType = ModelTypeGenerator.Create(returnParameterType, "", true);
  32. var parameters = method.GetParameters();
  33. foreach (var parameter in parameters)
  34. {
  35. var parameterType = parameter.ParameterType;
  36. var parameterModelType = ModelTypeGenerator.Create(parameterType, parameter.Name, true);
  37. ParameterModelTypes.Add(parameterModelType);
  38. }
  39. }
  40. public string GetMethodDartString()
  41. {
  42. var dartString = new StringBuilder();
  43. var parameterNames = string.Join(",", ParameterModelTypes.Select(r => r.GetFlutterTypeName() + " " + r.Name_Lower));
  44. var argumentNames = string.Join(",", ParameterModelTypes.Select(r => r.Name_Lower));
  45. if (ParameterModelTypes.Count > 1)
  46. {
  47. argumentNames = "[" + argumentNames + "]";
  48. }
  49. dartString.AppendLine($"\tFuture<{ReturnParameterModelType.GetFlutterTypeName()}> {LetterConverterHelper.FirstCharToLower(MethodName)}({parameterNames}) async {{");
  50. if (ReturnParameterModelType is VoidModelType)
  51. {
  52. dartString.AppendLine($"\t\tawait call(\"{MethodName}\", {argumentNames});");
  53. }
  54. else
  55. {
  56. dartString.AppendLine($"\t\tvar rpcRst = await call(\"{MethodName}\", {argumentNames});");
  57. if (ReturnParameterModelType is SimpleModelType && !(ReturnParameterModelType is ListModelType) && !(ReturnParameterModelType is DictionaryModelType) && !(ReturnParameterModelType is ArrayModelType))
  58. {
  59. dartString.AppendLine("\t\treturn rpcRst;");
  60. }
  61. else if (ReturnParameterModelType is UserDefinedModelType || ReturnParameterModelType is UserDefinedGenericModelType || ReturnParameterModelType is UserDefinedDerivedModelType)
  62. {
  63. dartString.AppendLine($"\t\tvar result = {ReturnParameterModelType.GetFlutterTypeName()}.fromJson(rpcRst as Map<String, dynamic>);");
  64. dartString.AppendLine("\t\treturn result;");
  65. }
  66. else if (ReturnParameterModelType is ListModelType genericModelType)
  67. {
  68. if (genericModelType.GenericArgumentModelType is SimpleModelType simpleModelType)
  69. {
  70. dartString.AppendLine($"\t\tvar result = (rpcRst as List).cast<{simpleModelType.GetFlutterTypeName()}>().toList();");
  71. dartString.AppendLine("\t\treturn result;");
  72. }
  73. else if (genericModelType.GenericArgumentModelType is EnumModelType enumModelType)
  74. {
  75. dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{enumModelType.GetFlutterTypeName()}.values.firstWhere((i) => i.index == e)).toList();");
  76. dartString.AppendLine("\t\treturn result;");
  77. }
  78. else if (genericModelType.GenericArgumentModelType is UserDefinedModelType userDefinedComplexModelType)
  79. {
  80. dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{userDefinedComplexModelType.GetFlutterTypeName()}.fromJson(e as Map<String, dynamic>)).toList();");
  81. dartString.AppendLine("\t\treturn result;");
  82. }
  83. else if (genericModelType.GenericArgumentModelType is UserDefinedDerivedModelType userDefinedDerivedModelType)
  84. {
  85. dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{userDefinedDerivedModelType.GetFlutterTypeName()}.fromJson(e as Map<String, dynamic>)).toList();");
  86. dartString.AppendLine("\t\treturn result;");
  87. }
  88. }
  89. else if (ReturnParameterModelType is ArrayModelType arrayModelType)
  90. {
  91. if (arrayModelType.Child is SimpleModelType simpleModelType)
  92. {
  93. dartString.AppendLine($"\t\tvar result = (rpcRst as List).cast<{simpleModelType.GetFlutterTypeName()}>().toList();");
  94. dartString.AppendLine("\t\treturn result;");
  95. }
  96. else if (arrayModelType.Child is EnumModelType enumModelType)
  97. {
  98. dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{enumModelType.GetFlutterTypeName()}.values.firstWhere((i) => i.index == e)).toList();");
  99. dartString.AppendLine("\t\treturn result;");
  100. }
  101. else if (arrayModelType.Child is UserDefinedModelType userDefinedComplexModelType)
  102. {
  103. dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{userDefinedComplexModelType.GetFlutterTypeName()}.fromJson(e as Map<String, dynamic>)).toList();");
  104. dartString.AppendLine("\t\treturn result;");
  105. }
  106. else if (arrayModelType.Child is UserDefinedDerivedModelType userDefinedDerivedModelType)
  107. {
  108. dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{userDefinedDerivedModelType.GetFlutterTypeName()}.fromJson(e as Map<String, dynamic>)).toList();");
  109. dartString.AppendLine("\t\treturn result;");
  110. }
  111. }
  112. else if (ReturnParameterModelType is DictionaryModelType dictionaryModelType)
  113. {
  114. dartString.AppendLine($"\t\tvar result = (rpcRst as Map).cast<{dictionaryModelType.GenericArgumentModelTypeList[0].GetFlutterTypeName()},{dictionaryModelType.GenericArgumentModelTypeList[1].GetFlutterTypeName()}>();");
  115. dartString.AppendLine("\t\treturn result;");
  116. }
  117. else if (ReturnParameterModelType is EnumModelType enumModelType)
  118. {
  119. dartString.AppendLine($"\t\tvar result = {enumModelType.GetFlutterTypeName()}.values.firstWhere((e) => e.index == rpcRst);");
  120. dartString.AppendLine("\t\treturn result;");
  121. }
  122. }
  123. dartString.AppendLine("\t}");
  124. return dartString.ToString();
  125. }
  126. }
  127. }