MethodMap.cs 6.8 KB

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