ModeType.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace FlutterCodeGenerator
  5. {
  6. public class ModelType
  7. {
  8. public Type ParameterType { get; set; }
  9. /// <summary>
  10. ///Name(First Character Lower Case)
  11. /// </summary>
  12. public string Name_Lower { get; set; }
  13. /// <summary>
  14. ///Name(First Character Upper Case)
  15. /// </summary>
  16. public string Name_Upper { get; set; }
  17. public string DefaultValue { get; set; }
  18. public ModelType(Type type, string name)
  19. {
  20. ParameterType = type;
  21. Name_Lower = LetterConverterHelper.FirstCharToLower(name);
  22. Name_Upper = LetterConverterHelper.FirstCharToUpper(name);
  23. DefaultValue = null;
  24. }
  25. public virtual string GetFlutterTypeName(bool isSingleName = true, bool isGenericName = false, bool isFirstPosition = true, string typeName = null)
  26. {
  27. return ParameterType.Name;
  28. }
  29. public virtual string GetDartString()
  30. {
  31. return string.Empty;
  32. }
  33. protected string QuestionMarkCheck(ModelType child)
  34. {
  35. if (child.DefaultValue != null)
  36. {
  37. return "";
  38. }
  39. else
  40. {
  41. return "?";
  42. }
  43. }
  44. }
  45. public class SimpleModelType : ModelType
  46. {
  47. public SimpleModelType(Type type, string name) : base(type, name)
  48. {
  49. }
  50. }
  51. public class StringModeType : SimpleModelType
  52. {
  53. public StringModeType(string name) : base(typeof(string), name)
  54. {
  55. }
  56. }
  57. public class DateTimeModeType : SimpleModelType
  58. {
  59. public DateTimeModeType(string name) : base(typeof(DateTime), name)
  60. {
  61. }
  62. }
  63. public class IntModeType : SimpleModelType
  64. {
  65. public IntModeType(string name) : base(typeof(int), name)
  66. {
  67. DefaultValue = "0";
  68. }
  69. public override string GetFlutterTypeName(bool isSingleName = true, bool isGenericName = false, bool isFirstPosition = true, string typeName = null)
  70. {
  71. return "int";
  72. }
  73. }
  74. public class DoubleModeType : SimpleModelType
  75. {
  76. public DoubleModeType(string name) : base(typeof(int), name)
  77. {
  78. DefaultValue = "0";
  79. }
  80. public override string GetFlutterTypeName(bool isSingleName = true, bool isGenericName = false, bool isFirstPosition = true, string typeName = null)
  81. {
  82. return "double";
  83. }
  84. }
  85. public class BoolModeType : SimpleModelType
  86. {
  87. public BoolModeType(string name) : base(typeof(bool), name)
  88. {
  89. DefaultValue = "false";
  90. }
  91. public override string GetFlutterTypeName(bool isSingleName = true, bool isGenericName = false, bool isFirstPosition = true, string typeName = null)
  92. {
  93. return "bool";
  94. }
  95. }
  96. public class ComplexModelType : ModelType
  97. {
  98. public List<ModelType> Children { get; set; }
  99. public ComplexModelType(Type type, string name) : base(type, name)
  100. {
  101. Children = new List<ModelType>();
  102. }
  103. protected string ToJson(List<ModelType> Children)
  104. {
  105. var source = new StringBuilder();
  106. source.AppendLine("\tMap<String, dynamic> toJson() {");
  107. source.AppendLine("\t\tfinal map = Map<String, dynamic>();");
  108. foreach (var child in Children)
  109. {
  110. if (child is EnumModeType)
  111. {
  112. source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower}.index;");
  113. }
  114. else if (child.DefaultValue != null)
  115. {
  116. source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};");
  117. }
  118. else
  119. {
  120. source.AppendLine($"\t\tif({child.Name_Lower} != null)");
  121. source.AppendLine($"\t\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};");
  122. }
  123. }
  124. source.AppendLine("\t\treturn map;");
  125. source.AppendLine("\t}");
  126. return source.ToString();
  127. }
  128. protected string FromJson(List<ModelType> Children)
  129. {
  130. var source = new StringBuilder();
  131. var flutterTypeName = GetFlutterTypeName();
  132. source.AppendLine($"\tfactory {flutterTypeName}.fromJson(Map<String, dynamic> map) {{");
  133. foreach (var child in Children)
  134. {
  135. if (child is ArrayModelType)
  136. {
  137. source.AppendLine($"\t\tfinal {child.Name_Lower}Data = map['{child.Name_Upper}'];");
  138. }
  139. else if (child is ListModelType listModelType)
  140. {
  141. if (this is UserDefinedGenericComplexModelType type)//List与Dictionary 不存在该情况
  142. {
  143. if (type.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType)
  144. {
  145. source.AppendLine($"\t\tList<T> {listModelType.Name_Lower}List = [];");
  146. source.AppendLine($"\t\tif (map['{listModelType.Name_Lower}'] != null) {{");
  147. source.AppendLine($"\t\t\t{listModelType.Name_Lower}List.addAll(");
  148. source.AppendLine($"\t\t\t\t\t(map['{listModelType.Name_Lower}'] as List).map((e) => FJsonConvert.fromJson<T>(e)!));");
  149. source.AppendLine($"\t\t}}");
  150. }
  151. }
  152. }
  153. else if (child is UserDefinedGenericComplexModelType userDefinedGenericComplexModelType)
  154. {
  155. if (this is UserDefinedGenericComplexModelType type)//List与Dictionary 不存在该情况
  156. {
  157. if (type.GenericArgumentModelType.ParameterType == userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType)
  158. {
  159. source.AppendLine($"\t\tList<T> {userDefinedGenericComplexModelType.Name_Lower}List = [];");
  160. source.AppendLine($"\t\tif (map['{userDefinedGenericComplexModelType.Name_Lower}'] != null) {{");
  161. source.AppendLine($"\t\t\t{userDefinedGenericComplexModelType.Name_Lower}List.addAll(");
  162. source.AppendLine($"\t\t\t\t\t(map['{userDefinedGenericComplexModelType.Name_Lower}'] as List).map((e) => FJsonConvert.fromJson<T>(e)!));");
  163. source.AppendLine($"\t\t}}");
  164. }
  165. }
  166. }
  167. }
  168. source.AppendLine($"\t\treturn {flutterTypeName}( ");
  169. foreach (var child in Children)
  170. {
  171. if (child is EnumModeType)
  172. {
  173. source.AppendLine($"\t\t\t{child.Name_Lower}: {child.GetFlutterTypeName()}.values.firstWhere((e) => e.index == map['{child.Name_Upper}']),");
  174. }
  175. else if (child is ArrayModelType)
  176. {
  177. source.AppendLine($"\t\t\t{child.Name_Lower}: {child.Name_Lower}Data != null ? ({child.Name_Lower}Data as List).map((e) => {child.ParameterType.Name.Replace("[]", string.Empty)}.fromJson(e)).toList(): const [],");
  178. }
  179. else if (child is ListModelType listModelType)
  180. {
  181. if (this is UserDefinedGenericComplexModelType type)
  182. {
  183. if (type.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType)
  184. {
  185. source.AppendLine($"\t\t\t{child.Name_Lower}: {listModelType.Name_Lower}List,");
  186. }
  187. else if (listModelType.GenericArgumentModelType is SimpleModelType)
  188. {
  189. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  190. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'].cast<{model}>().toList(),");
  191. }
  192. else
  193. {
  194. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  195. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'].map((e)=>{model}.fromJson(e as Map<String,dynamic>)).toList(),");
  196. }
  197. }
  198. else if (this is UserDefinedComplexModeType)
  199. {
  200. if (listModelType.GenericArgumentModelType is SimpleModelType)
  201. {
  202. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  203. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'].cast<{model}>().toList(),");
  204. }
  205. else
  206. {
  207. var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
  208. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'].map((e)=>{model}.fromJson(e as Map<String,dynamic>)).toList(),");
  209. }
  210. }
  211. }
  212. else if (child is DictionaryModelType dictionaryModelType)
  213. {
  214. var argumentName1 = dictionaryModelType.GenericArgumentModelTypeList[0].GetFlutterTypeName();
  215. var argumentName2 = dictionaryModelType.GenericArgumentModelTypeList[1].GetFlutterTypeName();
  216. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'].cast<{argumentName1},{argumentName2}>(),");
  217. }
  218. else if (child is UserDefinedGenericComplexModelType userDefinedGenericComplexModelType)
  219. {
  220. if (this is UserDefinedGenericComplexModelType type)
  221. {
  222. if (type.GenericArgumentModelType.ParameterType == userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType)
  223. {
  224. source.AppendLine($"\t\t\t{child.Name_Lower}: {userDefinedGenericComplexModelType.Name_Lower}List,");
  225. }
  226. else if (userDefinedGenericComplexModelType.GenericArgumentModelType is SimpleModelType)
  227. {
  228. var model = userDefinedGenericComplexModelType.GenericArgumentModelType.GetFlutterTypeName();
  229. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'].cast<{model}>().toList(),");
  230. }
  231. else
  232. {
  233. var model = userDefinedGenericComplexModelType.GenericArgumentModelType.GetFlutterTypeName();
  234. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'].map((e)=>{model}.fromJson(e as Map<String,dynamic>)).toList(),");
  235. }
  236. }
  237. else if (this is UserDefinedComplexModeType)
  238. {
  239. if (userDefinedGenericComplexModelType.GenericArgumentModelType is SimpleModelType)
  240. {
  241. var model = userDefinedGenericComplexModelType.GenericArgumentModelType.GetFlutterTypeName();
  242. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'].cast<{model}>().toList(),");
  243. }
  244. else
  245. {
  246. var model = userDefinedGenericComplexModelType.GenericArgumentModelType.GetFlutterTypeName();
  247. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'].map((e)=>{model}.fromJson(e as Map<String,dynamic>)).toList(),");
  248. }
  249. }
  250. }
  251. else
  252. {
  253. source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'],");
  254. }
  255. }
  256. source.AppendLine("\t\t);");
  257. source.AppendLine("\t}");
  258. source.AppendLine();
  259. return source.ToString();
  260. }
  261. }
  262. public class EnumModeType : ComplexModelType
  263. {
  264. public EnumModeType(Type type, string name) : base(type, name)
  265. {
  266. var firstChildName = Enum.GetNames(type)[0];
  267. DefaultValue = $"{GetFlutterTypeName()}.{firstChildName}";
  268. }
  269. public override string GetDartString()
  270. {
  271. var dartString = new StringBuilder();
  272. dartString.AppendLine($"enum {GetFlutterTypeName()} {{");
  273. foreach (var enumvalue in Enum.GetNames(ParameterType))
  274. {
  275. dartString.AppendLine($"\t{enumvalue},");
  276. }
  277. dartString.AppendLine("}");
  278. return dartString.ToString();
  279. }
  280. }
  281. public class ArrayModelType : SimpleModelType
  282. {
  283. public ArrayModelType(Type type, string name) : base(type, name)
  284. {
  285. var arraytypeName = ParameterType.FullName.Replace("[]", string.Empty);
  286. var arraytype = ParameterType.Assembly.GetType(arraytypeName);
  287. ModelTypeGenerator.Create(arraytype, "");
  288. }
  289. public override string GetFlutterTypeName(bool isSingleName = true, bool isGenericName = false, bool isFirstPosition = true, string typeName = null)
  290. {
  291. return $"List<{ParameterType.Name[0..^2]}>";
  292. }
  293. }
  294. public class ListModelType : SimpleModelType
  295. {
  296. public ModelType GenericArgumentModelType;
  297. public ListModelType(Type type, string name) : base(type, name)
  298. {
  299. var modelType = ModelTypeGenerator.Create(type.GetGenericArguments()[0], "");
  300. GenericArgumentModelType = modelType;
  301. }
  302. public override string GetFlutterTypeName(bool isSingleName = true, bool isGenericName = false, bool isFirstPosition = true, string typeName = null)
  303. {
  304. if (isSingleName)
  305. {
  306. return ParameterType.Name[0..^2];
  307. }
  308. else
  309. {
  310. if (!isGenericName)
  311. {
  312. return ParameterType.Name[0..^2] + "<" + GenericArgumentModelType.GetFlutterTypeName() + ">";
  313. }
  314. else
  315. {
  316. return ParameterType.Name[0..^2] + "<T>";
  317. }
  318. }
  319. }
  320. }
  321. /// <summary>
  322. /// Dictionary Type, 默认没有复杂型
  323. /// </summary>
  324. public class DictionaryModelType : SimpleModelType
  325. {
  326. public List<ModelType> GenericArgumentModelTypeList;
  327. public DictionaryModelType(Type type, string name) : base(type, name)
  328. {
  329. GenericArgumentModelTypeList = new List<ModelType>();
  330. foreach (var argumentType in type.GetGenericArguments())
  331. {
  332. var modelType = ModelTypeGenerator.Create(argumentType, "");
  333. GenericArgumentModelTypeList.Add(modelType);
  334. }
  335. }
  336. public override string GetFlutterTypeName(bool isSingleName = true, bool isGenericName = false, bool isFirstPosition = true, string typeName = null)
  337. {
  338. if (isSingleName)
  339. {
  340. return ParameterType.Name[0..^2].Replace("Dictionary", "Map");
  341. }
  342. else
  343. {
  344. var flutterTypeName = ParameterType.Name[0..^2].Replace("Dictionary", "Map");
  345. if (!isGenericName)
  346. {
  347. flutterTypeName += "<" + GenericArgumentModelTypeList[0].GetFlutterTypeName() + "," + GenericArgumentModelTypeList[1].GetFlutterTypeName() + ">";
  348. return flutterTypeName;
  349. }
  350. else
  351. {
  352. if (isFirstPosition)
  353. {
  354. flutterTypeName += $"<{typeName},T>";
  355. }
  356. else
  357. {
  358. flutterTypeName += $"<T,{typeName}>";
  359. }
  360. return flutterTypeName;
  361. }
  362. }
  363. }
  364. }
  365. /// <summary>
  366. /// 自定义泛型复杂类,默认一维
  367. /// </summary>
  368. public class UserDefinedGenericComplexModelType : ComplexModelType
  369. {
  370. public ModelType GenericArgumentModelType;
  371. public UserDefinedGenericComplexModelType(Type type, string name) : base(type, name)
  372. {
  373. var properties = type.GetProperties();
  374. foreach (var property in properties)
  375. {
  376. var child = ModelTypeGenerator.Create(property.PropertyType, property.Name);
  377. Children.Add(child);
  378. }
  379. var modelType = ModelTypeGenerator.Create(type.GetGenericArguments()[0], "");
  380. GenericArgumentModelType = modelType;
  381. }
  382. public override string GetFlutterTypeName(bool isSingleName = true, bool isGenericName = false, bool isFirstPosition = true, string typeName = null)
  383. {
  384. if (isSingleName)
  385. {
  386. return ParameterType.Name[0..^2];
  387. }
  388. else
  389. {
  390. if (!isGenericName)
  391. {
  392. return ParameterType.Name[0..^2] + "<" + GenericArgumentModelType.GetFlutterTypeName() + ">";
  393. }
  394. else
  395. {
  396. return ParameterType.Name[0..^2] + "<T>";
  397. }
  398. }
  399. }
  400. public override string GetDartString()
  401. {
  402. var dartString = new StringBuilder();
  403. dartString.AppendLine($"class {GetFlutterTypeName(false, true)} {{");
  404. foreach (var child in Children)
  405. {
  406. string argumentName;
  407. var questionMark = QuestionMarkCheck(child);
  408. if (child is ListModelType listModelType)
  409. {
  410. argumentName = GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType ? listModelType.GetFlutterTypeName(false, true) : listModelType.GetFlutterTypeName();
  411. }
  412. else if (child is UserDefinedGenericComplexModelType userDefinedGenericComplexModelType)
  413. {
  414. argumentName = GenericArgumentModelType.ParameterType == userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType ? userDefinedGenericComplexModelType.GetFlutterTypeName(false, true) : userDefinedGenericComplexModelType.GetFlutterTypeName();
  415. }
  416. else
  417. {
  418. argumentName = child.GetFlutterTypeName();
  419. }
  420. dartString.AppendLine($"\t{argumentName}{questionMark} {child.Name_Lower};");
  421. }
  422. dartString.AppendLine();
  423. dartString.AppendLine($"\t{GetFlutterTypeName()}({{");
  424. foreach (var child in Children)
  425. {
  426. if (child.DefaultValue != null)
  427. {
  428. dartString.AppendLine($"\t\tthis.{child.Name_Lower}={child.DefaultValue},");
  429. }
  430. else
  431. {
  432. dartString.AppendLine($"\t\tthis.{child.Name_Lower},");
  433. }
  434. }
  435. dartString.AppendLine("\t});");
  436. dartString.AppendLine();
  437. dartString.Append(FromJson(Children));
  438. dartString.Append(ToJson(Children));
  439. dartString.AppendLine("}");
  440. return dartString.ToString();
  441. }
  442. }
  443. public class UserDefinedComplexModeType : ComplexModelType
  444. {
  445. public UserDefinedComplexModeType(Type type, string name) : base(type, name)
  446. {
  447. var properties = type.GetProperties();
  448. foreach (var property in properties)
  449. {
  450. var child = ModelTypeGenerator.Create(property.PropertyType, property.Name);
  451. Children.Add(child);
  452. }
  453. }
  454. public override string GetFlutterTypeName(bool isSingleName = true, bool isGenericName = false, bool isFirstPosition = true, string typeName = null)
  455. {
  456. return $"{ParameterType.Name}";
  457. }
  458. public override string GetDartString()
  459. {
  460. var dartString = new StringBuilder();
  461. dartString.AppendLine($"class {GetFlutterTypeName()} {{");
  462. foreach (var child in Children)
  463. {
  464. var questionMark = QuestionMarkCheck(child);
  465. if (child is ListModelType || child is DictionaryModelType || child is UserDefinedGenericComplexModelType)
  466. {
  467. dartString.AppendLine($"\t{child.GetFlutterTypeName(false, false)}{questionMark} {child.Name_Lower};");
  468. }
  469. else
  470. {
  471. dartString.AppendLine($"\t{child.GetFlutterTypeName()}{questionMark} {child.Name_Lower};");
  472. }
  473. }
  474. dartString.AppendLine();
  475. dartString.AppendLine($"\t{GetFlutterTypeName()}({{");
  476. foreach (var child in Children)
  477. {
  478. if (child.DefaultValue != null)
  479. {
  480. dartString.AppendLine($"\t\tthis.{child.Name_Lower}={child.DefaultValue},");
  481. }
  482. else
  483. {
  484. dartString.AppendLine($"\t\tthis.{child.Name_Lower},");
  485. }
  486. }
  487. dartString.AppendLine("\t});");
  488. dartString.AppendLine();
  489. dartString.Append(FromJson(Children));
  490. dartString.Append(ToJson(Children));
  491. dartString.AppendLine("}");
  492. return dartString.ToString();
  493. }
  494. }
  495. }