MethodMap.cs 7.2 KB

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