Browse Source

Add NotificationServiceMap and OtherServiceMap,生成逻辑改为获取所有Type,过滤黑名单内的InterfaceService,根据剩余的InterfaceService生成代码,再生成Notificaiton实体,最后生成其余的实体类

felix 2 years ago
parent
commit
899da9f02d
11 changed files with 339 additions and 109 deletions
  1. 46 29
      CodeGenerator.cs
  2. 3 3
      GenerateDataCache.cs
  3. 13 0
      IServiceMap.cs
  4. 1 1
      LetterConverterHelper.cs
  5. 15 15
      MethodMap.cs
  6. 43 36
      ModelType.cs
  7. 17 12
      ModelTypeGenerator.cs
  8. 94 0
      NotificationServiceMap.cs
  9. 94 0
      OtherServiceMap.cs
  10. 3 3
      Program.cs
  11. 10 10
      ServiceMap.cs

+ 46 - 29
CodeGenerator.cs

@@ -16,7 +16,7 @@ namespace FlutterCodeGenerator
         private const string _dllName = "WingInterfaceLibrary.dll";
         private readonly string _indexDart = "index.dart";
         private readonly string _rpcDart = "rpc.dart";
-        private Dictionary<string, ServiceMap> _serviceMapDictionary;
+        private Dictionary<string, IServiceMap> _serviceMapDictionary;
         private List<string> _generatedServiceFileNameList;
         private List<string> _generatedServiceModelFileNameList;
 
@@ -31,7 +31,7 @@ namespace FlutterCodeGenerator
             _dllPath = dllPath;
             _serviceFolderPath = Path.Combine(_generatedFolderPath, "services");
             _rpcTextPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "rpc.txt");
-            _serviceMapDictionary = new Dictionary<string, ServiceMap>();
+            _serviceMapDictionary = new Dictionary<string, IServiceMap>();
             _generatedServiceFileNameList = new List<string>() { "platform.dart" };
             _generatedServiceModelFileNameList = new List<string>() { "platform.m.dart" };
             LoadDll();
@@ -47,19 +47,22 @@ namespace FlutterCodeGenerator
             var assemblybytes = File.ReadAllBytes(dll);
             var assembly = Assembly.Load(assemblybytes);
             var allTypes = assembly.GetTypes();
-            var liveConsultationService = allTypes.FirstOrDefault(x => x.FullName.Contains(".LiveConsultation") && x.Name.EndsWith("Service"));
-            if (liveConsultationService == null)
-            {
-                throw new Exception("Live Consultation Service Load Failed.");
-            }
-            var interfaceTypes = allTypes.Where(x => x.FullName.Contains(".Interface.") && x.Name.EndsWith("Service") && !x.Name.EndsWith("DBService") && !x.Name.EndsWith("ManagementService") && !x.Name.EndsWith("NotificationService")).ToList();
-            interfaceTypes.Add(liveConsultationService);
+            var restTypes = allTypes.Where(x => !x.FullName.Contains("DB") && !x.Name.EndsWith("ManagementService") && !x.Name.EndsWith("NotificationService")).ToList();
+            var interfaceTypes = restTypes.Where(x => x.FullName.EndsWith("Service") && x.IsInterface).ToList();
+            restTypes = restTypes.Except(interfaceTypes).ToList();
+            var notificationTypes = restTypes.Where(x => x.GetInterfaces().Any(x => x.Name.Contains("INotificationDTO"))).ToList();
+            restTypes = restTypes.Except(notificationTypes).ToList();
+            var restNeedGeneratedTypes = restTypes.Where(x => !x.GetProperties().Any(y => y.PropertyType == typeof(object)) && !x.GetProperties().Any(y => string.IsNullOrWhiteSpace(y.PropertyType.FullName))).ToList();
             foreach (var interfaceType in interfaceTypes)
             {
                 var sericeName = interfaceType.Name[1..];
                 var serviceMap = new ServiceMap(interfaceType);
                 _serviceMapDictionary.Add(LetterConverterHelper.FirstCharToLower(sericeName), serviceMap);
             }
+            var notificationServiceMap = new NotificationServiceMap(notificationTypes);
+            _serviceMapDictionary.Add("notificationService", notificationServiceMap);
+            var otherServiceMap = new OtherServiceMap(restNeedGeneratedTypes);
+            _serviceMapDictionary.Add("otherService", otherServiceMap);
         }
 
         private void CheckDirectory()
@@ -83,25 +86,36 @@ namespace FlutterCodeGenerator
                 var serviceModelDartPath = Path.Combine(_serviceFolderPath, serviceModelDartFileName);
                 var serviceModelDartString = serviceMap.Value.GetServiceModelDartString();
                 var serviceString = serviceMap.Value.GetServiceDartString();
-                var serviceDartString = new StringBuilder();
-                serviceDartString.AppendLine(StringDartCore);
-                serviceDartString.AppendLine();
-                serviceDartString.AppendLine(StringClientBase);
-                if (serviceString.Contains("FJsonConvert"))
+                if (string.IsNullOrWhiteSpace(serviceString))
                 {
-                    serviceDartString.AppendLine(StringJsonConvert);
+                    if (serviceModelDartString != null)
+                    {
+                        File.WriteAllText(serviceModelDartPath, serviceModelDartString);
+                        _generatedServiceModelFileNameList.Add(serviceModelDartFileName);
+                    }
                 }
-                serviceDartString.AppendLine();
-                if (serviceModelDartString != null)
+                else
                 {
-                    File.WriteAllText(serviceModelDartPath, serviceModelDartString);
-                    serviceDartString.AppendLine($"import '{serviceModelDartFileName}';");
-                    _generatedServiceModelFileNameList.Add(serviceModelDartFileName);
+                    var serviceDartString = new StringBuilder();
+                    serviceDartString.AppendLine(StringDartCore);
+                    serviceDartString.AppendLine();
+                    serviceDartString.AppendLine(StringClientBase);
+                    if (serviceString.Contains("FJsonConvert"))
+                    {
+                        serviceDartString.AppendLine(StringJsonConvert);
+                    }
+                    serviceDartString.AppendLine();
+                    if (serviceModelDartString != null)
+                    {
+                        File.WriteAllText(serviceModelDartPath, serviceModelDartString);
+                        serviceDartString.AppendLine($"import '{serviceModelDartFileName}';");
+                        _generatedServiceModelFileNameList.Add(serviceModelDartFileName);
+                    }
+                    serviceDartString.AppendLine();
+                    serviceDartString.AppendLine(serviceString);
+                    File.WriteAllText(serviceDartPath, serviceDartString.ToString());
+                    _generatedServiceFileNameList.Add(serviceDartFileName);
                 }
-                serviceDartString.AppendLine();
-                serviceDartString.AppendLine(serviceString);
-                File.WriteAllText(serviceDartPath, serviceDartString.ToString());
-                _generatedServiceFileNameList.Add(serviceDartFileName);
             }
             GenerateIndexDart();
             GenerateRpcDart();
@@ -120,11 +134,14 @@ namespace FlutterCodeGenerator
             dartString.AppendLine(tempStringArray[0]);
             foreach (var serviceMap in _serviceMapDictionary)
             {
-                var serviceName = LetterConverterHelper.FirstCharToUpper_2(serviceMap.Key);
-                var actionName = serviceMap.Key[0..^7];
-                dartString.AppendLine($"\t{serviceName} get {actionName} =>");
-                dartString.AppendLine($"\tfindService(() => new {serviceName}(currentHostAddress));");
-                dartString.AppendLine();
+                if (serviceMap.Value is ServiceMap)
+                {
+                    var serviceName = LetterConverterHelper.FirstCharToUpper_2(serviceMap.Key);
+                    var actionName = serviceMap.Key[0..^7];
+                    dartString.AppendLine($"\t{serviceName} get {actionName} =>");
+                    dartString.AppendLine($"\tfindService(() => new {serviceName}(currentHostAddress));");
+                    dartString.AppendLine();
+                }
             }
             dartString.AppendLine(tempStringArray[1]);
             File.WriteAllText(rpcFilePath, dartString.ToString());

+ 3 - 3
GenerateDataCache.cs

@@ -6,7 +6,7 @@ namespace FlutterCodeGenerator
     {
         private static GenerateDataCache _instance;
 
-        private ServiceMap _currentServiceMap;
+        private IServiceMap _currentServiceMap;
 
         public static GenerateDataCache Instance => _instance ?? (_instance = new GenerateDataCache());
 
@@ -20,12 +20,12 @@ namespace FlutterCodeGenerator
             ConflictModelTypeList = new Dictionary<string, Dictionary<ModelType, int>>();
         }
 
-        public void SetCurrentServiceMap(ServiceMap serviceMap)
+        public void SetCurrentServiceMap(IServiceMap serviceMap)
         {
             _currentServiceMap = serviceMap;
         }
 
-        public ServiceMap GetCurrentServiceMap()
+        public IServiceMap GetCurrentServiceMap()
         {
             return _currentServiceMap;
         }

+ 13 - 0
IServiceMap.cs

@@ -0,0 +1,13 @@
+using System.Collections.Generic;
+
+namespace FlutterCodeGenerator
+{
+    internal interface IServiceMap
+    {
+        string GetServiceModelDartString();
+
+        string GetServiceDartString();
+
+        List<ComplexModelType> UsedComplexModelTypeList { get; }
+    }
+}

+ 1 - 1
LetterConverterHelper.cs

@@ -49,4 +49,4 @@ namespace FlutterCodeGenerator
             return str;
         }
     }
-}
+}

+ 15 - 15
MethodMap.cs

@@ -9,13 +9,13 @@ namespace FlutterCodeGenerator
 {
     internal class MethodMap
     {
-        public List<ModelType> ParameterModeTypes;
+        public List<ModelType> ParameterModelTypes;
         public ModelType ReturnParameterModelType { get; set; }
         private readonly string _methodName;
 
         public MethodMap(MethodInfo method)
         {
-            ParameterModeTypes = new List<ModelType>();
+            ParameterModelTypes = new List<ModelType>();
             _methodName = method.Name;
             Type returnParameterType;
             if (!method.ReturnType.IsGenericType)
@@ -33,17 +33,17 @@ namespace FlutterCodeGenerator
             foreach (var parameter in parameters)
             {
                 var parameterType = parameter.ParameterType;
-                var parameterModeType = ModelTypeGenerator.Create(parameterType, parameter.Name, true);
-                ParameterModeTypes.Add(parameterModeType);
+                var parameterModelType = ModelTypeGenerator.Create(parameterType, parameter.Name, true);
+                ParameterModelTypes.Add(parameterModelType);
             }
         }
 
         public string GetMethodDartString()
         {
             var dartString = new StringBuilder();
-            var parameterNames = string.Join(",", ParameterModeTypes.Select(r => r.GetFlutterTypeName() + " " + r.Name_Lower));
-            var argumentNames = string.Join(",", ParameterModeTypes.Select(r => r.Name_Lower));
-            if (ParameterModeTypes.Count > 1)
+            var parameterNames = string.Join(",", ParameterModelTypes.Select(r => r.GetFlutterTypeName() + " " + r.Name_Lower));
+            var argumentNames = string.Join(",", ParameterModelTypes.Select(r => r.Name_Lower));
+            if (ParameterModelTypes.Count > 1)
             {
                 argumentNames = "[" + argumentNames + "]";
             }
@@ -59,7 +59,7 @@ namespace FlutterCodeGenerator
                 {
                     dartString.AppendLine("\t\treturn rpcRst;");
                 }
-                else if (ReturnParameterModelType is UserDefinedModeType || ReturnParameterModelType is UserDefinedGenericModelType || ReturnParameterModelType is UserDefinedDerivedModelType)
+                else if (ReturnParameterModelType is UserDefinedModelType || ReturnParameterModelType is UserDefinedGenericModelType || ReturnParameterModelType is UserDefinedDerivedModelType)
                 {
                     dartString.AppendLine($"\t\tvar result = {ReturnParameterModelType.GetFlutterTypeName()}.fromJson(rpcRst as Map<String, dynamic>);");
                     dartString.AppendLine("\t\treturn result;");
@@ -71,14 +71,14 @@ namespace FlutterCodeGenerator
                         dartString.AppendLine($"\t\tvar result = (rpcRst as List).cast<{simpleModelType.GetFlutterTypeName()}>().toList();");
                         dartString.AppendLine("\t\treturn result;");
                     }
-                    else if (genericModelType.GenericArgumentModelType is EnumModeType enumModelType)
+                    else if (genericModelType.GenericArgumentModelType is EnumModelType enumModelType)
                     {
                         dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{enumModelType.GetFlutterTypeName()}.values.firstWhere((i) => i.index == e)).toList();");
                         dartString.AppendLine("\t\treturn result;");
                     }
-                    else if (genericModelType.GenericArgumentModelType is UserDefinedModeType userDefinedComplexModeType)
+                    else if (genericModelType.GenericArgumentModelType is UserDefinedModelType userDefinedComplexModelType)
                     {
-                        dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{userDefinedComplexModeType.GetFlutterTypeName()}.fromJson(e as Map<String, dynamic>)).toList();");
+                        dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{userDefinedComplexModelType.GetFlutterTypeName()}.fromJson(e as Map<String, dynamic>)).toList();");
                         dartString.AppendLine("\t\treturn result;");
                     }
                     else if (genericModelType.GenericArgumentModelType is UserDefinedDerivedModelType userDefinedDerivedModelType)
@@ -94,14 +94,14 @@ namespace FlutterCodeGenerator
                         dartString.AppendLine($"\t\tvar result = (rpcRst as List).cast<{simpleModelType.GetFlutterTypeName()}>().toList();");
                         dartString.AppendLine("\t\treturn result;");
                     }
-                    else if (arrayModelType.Child is EnumModeType enumModelType)
+                    else if (arrayModelType.Child is EnumModelType enumModelType)
                     {
                         dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{enumModelType.GetFlutterTypeName()}.values.firstWhere((i) => i.index == e)).toList();");
                         dartString.AppendLine("\t\treturn result;");
                     }
-                    else if (arrayModelType.Child is UserDefinedModeType userDefinedComplexModeType)
+                    else if (arrayModelType.Child is UserDefinedModelType userDefinedComplexModelType)
                     {
-                        dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{userDefinedComplexModeType.GetFlutterTypeName()}.fromJson(e as Map<String, dynamic>)).toList();");
+                        dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{userDefinedComplexModelType.GetFlutterTypeName()}.fromJson(e as Map<String, dynamic>)).toList();");
                         dartString.AppendLine("\t\treturn result;");
                     }
                     else if (arrayModelType.Child is UserDefinedDerivedModelType userDefinedDerivedModelType)
@@ -120,4 +120,4 @@ namespace FlutterCodeGenerator
             return dartString.ToString();
         }
     }
-}
+}

+ 43 - 36
ModeType.cs → ModelType.cs

@@ -65,23 +65,23 @@ namespace FlutterCodeGenerator
         }
     }
 
-    public class StringModeType : SimpleModelType
+    public class StringModelType : SimpleModelType
     {
-        public StringModeType(string name) : base(typeof(string), name)
+        public StringModelType(string name) : base(typeof(string), name)
         {
         }
     }
 
-    public class DateTimeModeType : SimpleModelType
+    public class DateTimeModelType : SimpleModelType
     {
-        public DateTimeModeType(string name) : base(typeof(DateTime), name)
+        public DateTimeModelType(string name) : base(typeof(DateTime), name)
         {
         }
     }
 
-    public class IntModeType : SimpleModelType
+    public class IntModelType : SimpleModelType
     {
-        public IntModeType(string name) : base(typeof(int), name)
+        public IntModelType(string name) : base(typeof(int), name)
         {
             DefaultValue = "0";
         }
@@ -92,9 +92,9 @@ namespace FlutterCodeGenerator
         }
     }
 
-    public class IntNullableModeType : SimpleModelType
+    public class IntNullableModelType : SimpleModelType
     {
-        public IntNullableModeType(string name) : base(typeof(int?), name)
+        public IntNullableModelType(string name) : base(typeof(int?), name)
         {
         }
 
@@ -141,9 +141,9 @@ namespace FlutterCodeGenerator
         }
     }
 
-    public class DoubleModeType : SimpleModelType
+    public class DoubleModelType : SimpleModelType
     {
-        public DoubleModeType(string name) : base(typeof(double), name)
+        public DoubleModelType(string name) : base(typeof(double), name)
         {
             DefaultValue = "0";
         }
@@ -154,9 +154,9 @@ namespace FlutterCodeGenerator
         }
     }
 
-    public class DoubleNullableModeType : SimpleModelType
+    public class DoubleNullableModelType : SimpleModelType
     {
-        public DoubleNullableModeType(string name) : base(typeof(double?), name)
+        public DoubleNullableModelType(string name) : base(typeof(double?), name)
         {
         }
 
@@ -166,9 +166,9 @@ namespace FlutterCodeGenerator
         }
     }
 
-    public class BoolModeType : SimpleModelType
+    public class BoolModelType : SimpleModelType
     {
-        public BoolModeType(string name) : base(typeof(bool), name)
+        public BoolModelType(string name) : base(typeof(bool), name)
         {
             DefaultValue = "false";
         }
@@ -179,9 +179,9 @@ namespace FlutterCodeGenerator
         }
     }
 
-    public class BoolNullableModeType : SimpleModelType
+    public class BoolNullableModelType : SimpleModelType
     {
-        public BoolNullableModeType(string name) : base(typeof(bool?), name)
+        public BoolNullableModelType(string name) : base(typeof(bool?), name)
         {
         }
 
@@ -191,6 +191,13 @@ namespace FlutterCodeGenerator
         }
     }
 
+    public class InterfaceModelType : SimpleModelType
+    {
+        public InterfaceModelType(string name) : base(typeof(string), name)
+        {
+        }
+    }
+
     public class ExtraObjectModelType : SimpleModelType
     {
         public ExtraObjectModelType(Type type, string name) : base(type, name)
@@ -214,7 +221,7 @@ namespace FlutterCodeGenerator
             source.AppendLine("\t\tfinal map = Map<String, dynamic>();");
             foreach (var child in Children)
             {
-                if (child is EnumModeType)
+                if (child is EnumModelType)
                 {
                     source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower}.index;");
                 }
@@ -222,7 +229,7 @@ namespace FlutterCodeGenerator
                 {
                     source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};");
                 }
-                else if (child is DateTimeModeType)
+                else if (child is DateTimeModelType)
                 {
                     source.AppendLine($"\t\tif({child.Name_Lower} != null)");
                     source.AppendLine($"\t\t\tmap['{child.Name_Upper}'] = JsonRpcUtils.dateFormat({child.Name_Lower}!);");
@@ -312,7 +319,7 @@ namespace FlutterCodeGenerator
             source.AppendLine($"\t\treturn {flutterTypeName}( ");
             foreach (var child in Children)
             {
-                if (child is EnumModeType)
+                if (child is EnumModelType)
                 {
                     source.AppendLine($"\t\t\t{child.Name_Lower}: {child.GetFlutterTypeName()}.values.firstWhere((e) => e.index == map['{child.Name_Upper}']),");
                 }
@@ -338,7 +345,7 @@ namespace FlutterCodeGenerator
                         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(): null,");
                     }
                 }
-                else if (child is DateTimeModeType)
+                else if (child is DateTimeModelType)
                 {
                     source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? DateTime.parse(map['{child.Name_Upper}']) : null,");
                 }
@@ -355,7 +362,7 @@ namespace FlutterCodeGenerator
                             var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
                             source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? map['{child.Name_Upper}'].cast<{model}>().toList() : null,");
                         }
-                        else if (listModelType.GenericArgumentModelType is EnumModeType)
+                        else if (listModelType.GenericArgumentModelType is EnumModelType)
                         {
                             var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
                             source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.values.firstWhere((i) => i.index == e)).toList() : null,");
@@ -377,7 +384,7 @@ namespace FlutterCodeGenerator
                             var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
                             source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? map['{child.Name_Upper}'].cast<{model}>().toList() : null,");
                         }
-                        else if (listModelType.GenericArgumentModelType is EnumModeType)
+                        else if (listModelType.GenericArgumentModelType is EnumModelType)
                         {
                             var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
                             source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.values.firstWhere((i) => i.index == e)).toList() : null,");
@@ -388,14 +395,14 @@ namespace FlutterCodeGenerator
                             source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.fromJson(e as Map<String,dynamic>)).toList() : null,");
                         }
                     }
-                    else if (this is UserDefinedModeType || this is UserDefinedDerivedModelType)
+                    else if (this is UserDefinedModelType || this is UserDefinedDerivedModelType)
                     {
                         if (listModelType.GenericArgumentModelType is SimpleModelType && !(listModelType.GenericArgumentModelType is ExtraObjectModelType))
                         {
                             var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
                             source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? map['{child.Name_Upper}'].cast<{model}>().toList() : null,");
                         }
-                        else if (listModelType.GenericArgumentModelType is EnumModeType)
+                        else if (listModelType.GenericArgumentModelType is EnumModelType)
                         {
                             var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
                             source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.values.firstWhere((i) => i.index == e)).toList() : null,");
@@ -426,7 +433,7 @@ namespace FlutterCodeGenerator
                             var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
                             source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? map['{child.Name_Upper}'].cast<{model}>().toList() : null,");
                         }
-                        else if (userDefinedGenericModelType.GenericArgumentModelType is EnumModeType)
+                        else if (userDefinedGenericModelType.GenericArgumentModelType is EnumModelType)
                         {
                             var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
                             source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.values.firstWhere((i) => i.index == e)).toList() : null,");
@@ -437,14 +444,14 @@ namespace FlutterCodeGenerator
                             source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.fromJson(e as Map<String,dynamic>)).toList() : null,");
                         }
                     }
-                    else if (this is UserDefinedModeType)
+                    else if (this is UserDefinedModelType)
                     {
                         if (userDefinedGenericModelType.GenericArgumentModelType is SimpleModelType && !(userDefinedGenericModelType.GenericArgumentModelType is ExtraObjectModelType))
                         {
                             var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
                             source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? map['{child.Name_Upper}'].cast<{model}>().toList() : null,");
                         }
-                        else if (userDefinedGenericModelType.GenericArgumentModelType is EnumModeType)
+                        else if (userDefinedGenericModelType.GenericArgumentModelType is EnumModelType)
                         {
                             var model = userDefinedGenericModelType.GenericArgumentModelType.GetFlutterTypeName();
                             source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? (map['{child.Name_Upper}'] as List).map((e)=>{model}.values.firstWhere((i) => i.index == e)).toList() : null,");
@@ -456,11 +463,11 @@ namespace FlutterCodeGenerator
                         }
                     }
                 }
-                else if (child is UserDefinedModeType || child is UserDefinedDerivedModelType)
+                else if (child is UserDefinedModelType || child is UserDefinedDerivedModelType)
                 {
                     source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'] != null ? {child.GetFlutterTypeName()}.fromJson(map['{child.Name_Upper}']) : null,");
                 }
-                else if (child is DoubleModeType)
+                else if (child is DoubleModelType)
                 {
                     source.AppendLine($"\t\t\t{child.Name_Lower}: double.parse(map['{child.Name_Upper}'].toString()),");
                 }
@@ -476,11 +483,11 @@ namespace FlutterCodeGenerator
         }
     }
 
-    public class EnumModeType : ComplexModelType
+    public class EnumModelType : ComplexModelType
     {
         private Dictionary<int, string> _userDefinedEnumDictionary;
 
-        public EnumModeType(Type type, string name) : base(type, name)
+        public EnumModelType(Type type, string name) : base(type, name)
         {
             _userDefinedEnumDictionary = new Dictionary<int, string>();
             var fields = ParameterType.GetFields();
@@ -739,9 +746,9 @@ namespace FlutterCodeGenerator
         }
     }
 
-    public class UserDefinedModeType : ComplexModelType
+    public class UserDefinedModelType : ComplexModelType
     {
-        public UserDefinedModeType(Type type, string name) : base(type, name)
+        public UserDefinedModelType(Type type, string name) : base(type, name)
         {
             var properties = type.GetProperties();
             foreach (var property in properties)
@@ -986,7 +993,7 @@ namespace FlutterCodeGenerator
                 {
                     if (!complexModelType.Children.Any(x => x.ParameterType == child.ParameterType && x.Name_Upper == child.Name_Upper))
                     {
-                        if (child is EnumModeType)
+                        if (child is EnumModelType)
                         {
                             source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower}.index;");
                         }
@@ -994,7 +1001,7 @@ namespace FlutterCodeGenerator
                         {
                             source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};");
                         }
-                        else if (child is DateTimeModeType)
+                        else if (child is DateTimeModelType)
                         {
                             source.AppendLine($"\t\tif({child.Name_Lower} != null)");
                             source.AppendLine($"\t\t\tmap['{child.Name_Upper}'] = JsonRpcUtils.dateFormat({child.Name_Lower}!);");
@@ -1012,4 +1019,4 @@ namespace FlutterCodeGenerator
             return source.ToString();
         }
     }
-}
+}

+ 17 - 12
ModeTypeGenerator.cs → ModelTypeGenerator.cs

@@ -16,7 +16,7 @@ namespace FlutterCodeGenerator
             }
             var usedComplexModelTypeList = GenerateDataCache.Instance.GetCurrentServiceMap().UsedComplexModelTypeList;
             var conflictModelTypeList = GenerateDataCache.Instance.ConflictModelTypeList;
-            if ((_tempTypes.ContainsKey(type) && _tempTypes[type] < 2) || !_tempTypes.ContainsKey(type))
+            if ((_tempTypes.ContainsKey(type) && _tempTypes[type] < 20) || !_tempTypes.ContainsKey(type))
             {
                 var duplicatedTime = 0;
                 if (_tempTypes.ContainsKey(type))
@@ -26,35 +26,35 @@ namespace FlutterCodeGenerator
                 duplicatedTime++;
                 if (type == typeof(int) || type == typeof(long) || type == typeof(short) || type == typeof(uint) || type == typeof(ulong) || type == typeof(ushort))
                 {
-                    return new IntModeType(argName);
+                    return new IntModelType(argName);
                 }
                 else if (type == typeof(int?) || type == typeof(long?) || type == typeof(short?) || type == typeof(uint?) || type == typeof(ulong?) || type == typeof(ushort?))
                 {
-                    return new IntNullableModeType(argName);
+                    return new IntNullableModelType(argName);
                 }
                 else if (type == typeof(float) || type == typeof(double))
                 {
-                    return new DoubleModeType(argName);
+                    return new DoubleModelType(argName);
                 }
                 else if (type == typeof(float?) || type == typeof(double?))
                 {
-                    return new DoubleNullableModeType(argName);
+                    return new DoubleNullableModelType(argName);
                 }
                 else if (type == typeof(bool))
                 {
-                    return new BoolModeType(argName);
+                    return new BoolModelType(argName);
                 }
                 else if (type == typeof(bool?))
                 {
-                    return new BoolNullableModeType(argName);
+                    return new BoolNullableModelType(argName);
                 }
                 else if (type == typeof(string) || type == typeof(char) || type.BaseType?.Name == "BaseParamsString" || type.BaseType?.Name == "BaseString")
                 {
-                    return new StringModeType(argName);
+                    return new StringModelType(argName);
                 }
                 else if (type == typeof(DateTime) || type == typeof(DateTime?))
                 {
-                    return new DateTimeModeType(argName);
+                    return new DateTimeModelType(argName);
                 }
                 else if (type == typeof(byte))
                 {
@@ -70,7 +70,7 @@ namespace FlutterCodeGenerator
                 }
                 else if (type.IsEnum)
                 {
-                    var modelType = new EnumModeType(type, argName);
+                    var modelType = new EnumModelType(type, argName);
                     if (!conflictModelTypeList.ContainsKey(modelType.ParameterType.Name))
                     {
                         conflictModelTypeList[modelType.ParameterType.Name] = new Dictionary<ModelType, int>() { { modelType, 1 } };
@@ -169,7 +169,7 @@ namespace FlutterCodeGenerator
                 {
                     throw new Exception("Object is not supported, it should be specific type.");
                 }
-                else if (type.BaseType != typeof(object))
+                else if (type.BaseType != typeof(object) && type.BaseType != null)
                 {
                     _tempTypes[type] = duplicatedTime;
                     var modelType = new UserDefinedDerivedModelType(type, argName);
@@ -196,10 +196,15 @@ namespace FlutterCodeGenerator
                     }
                     return modelType;
                 }
+                else if (type.IsInterface)
+                {
+                    var modelType = new InterfaceModelType(argName);
+                    return modelType;
+                }
                 else
                 {
                     _tempTypes[type] = duplicatedTime;
-                    var modelType = new UserDefinedModeType(type, argName);
+                    var modelType = new UserDefinedModelType(type, argName);
                     if (!conflictModelTypeList.ContainsKey(modelType.ParameterType.Name))
                     {
                         conflictModelTypeList[modelType.ParameterType.Name] = new Dictionary<ModelType, int>() { { modelType, 1 } };

+ 94 - 0
NotificationServiceMap.cs

@@ -0,0 +1,94 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace FlutterCodeGenerator
+{
+    internal class NotificationServiceMap : IServiceMap
+    {
+        private List<Type> _typeList;
+        private string _serviceName;
+        public List<ComplexModelType> UsedComplexModelTypeList { get; }
+
+        public NotificationServiceMap(List<Type> types)
+        {
+            _typeList = types;
+            UsedComplexModelTypeList = new List<ComplexModelType>();
+            GenerateDataCache.Instance.SetCurrentServiceMap(this);
+            _serviceName = "NotificationService";
+            foreach (var type in _typeList)
+            {
+                try
+                {
+                    var parameterModelType = ModelTypeGenerator.Create(type, type.Name, true);
+                }
+                catch (Exception ex)
+                {
+                    Console.WriteLine($"Type is {type.FullName},Error:{ex}");
+                    throw;
+                }
+            }
+        }
+
+        public string GetServiceDartString()
+        {
+            return null;
+        }
+
+        public string GetServiceModelDartString()
+        {
+            var dartString = new StringBuilder();
+            var importServiceList = new List<string>();
+            var alreadyGeneratedList = GenerateDataCache.Instance.AlreadyGeneratedList;
+            foreach (var modelType in UsedComplexModelTypeList)
+            {
+                if (!alreadyGeneratedList.Any(x => x.Key.ParameterType.Name == modelType.ParameterType.Name && x.Key.ParameterType.Namespace == modelType.ParameterType.Namespace))
+                {
+                    alreadyGeneratedList.Add(modelType, _serviceName);
+                    dartString.AppendLine(modelType.GetDartString());
+                }
+                else
+                {
+                    var importService = alreadyGeneratedList.FirstOrDefault(x => x.Key.ParameterType.Name == modelType.ParameterType.Name && x.Key.ParameterType.Namespace == modelType.ParameterType.Namespace).Value;
+                    if (importService == null)
+                    {
+                        throw new Exception("Import Service is null");
+                    }
+                    if (importService != _serviceName && !importServiceList.Contains(importService))
+                    {
+                        importServiceList.Add(importService);
+                    }
+                }
+            }
+            if (string.IsNullOrWhiteSpace(dartString.ToString()))
+            {
+                return null;
+            }
+            var serviceModelDartString = new StringBuilder();
+            foreach (var importService in importServiceList)
+            {
+                serviceModelDartString.AppendLine($"import '{LetterConverterHelper.FirstCharToLower(importService[0..^7])}.m.dart';");
+            }
+            if (importServiceList.Count > 0)
+            {
+                serviceModelDartString.AppendLine();
+            }
+
+            var dartStringInfo = dartString.ToString();
+            if (dartStringInfo.Contains("JsonRpcUtils"))
+            {
+                serviceModelDartString.AppendLine(CodeGenerator.StringUtils);
+                serviceModelDartString.AppendLine();
+            }
+
+            if (dartStringInfo.Contains("FJsonConvert"))
+            {
+                serviceModelDartString.AppendLine(CodeGenerator.StringJsonConvert);
+                serviceModelDartString.AppendLine();
+            }
+            serviceModelDartString.AppendLine(dartStringInfo);
+            return serviceModelDartString.ToString();
+        }
+    }
+}

+ 94 - 0
OtherServiceMap.cs

@@ -0,0 +1,94 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace FlutterCodeGenerator
+{
+    internal class OtherServiceMap : IServiceMap
+    {
+        private List<Type> _typeList;
+        private string _serviceName;
+        public List<ComplexModelType> UsedComplexModelTypeList { get; }
+
+        public OtherServiceMap(List<Type> types)
+        {
+            _typeList = types;
+            UsedComplexModelTypeList = new List<ComplexModelType>();
+            GenerateDataCache.Instance.SetCurrentServiceMap(this);
+            _serviceName = "OtherService";
+            foreach (var type in _typeList)
+            {
+                try
+                {
+                    var parameterModelType = ModelTypeGenerator.Create(type, type.Name, true);
+                }
+                catch (Exception ex)
+                {
+                    Console.WriteLine($"Type is {type.FullName},Error:{ex}");
+                    throw;
+                }
+            }
+        }
+
+        public string GetServiceDartString()
+        {
+            return null;
+        }
+
+        public string GetServiceModelDartString()
+        {
+            var dartString = new StringBuilder();
+            var importServiceList = new List<string>();
+            var alreadyGeneratedList = GenerateDataCache.Instance.AlreadyGeneratedList;
+            foreach (var modelType in UsedComplexModelTypeList)
+            {
+                if (!alreadyGeneratedList.Any(x => x.Key.ParameterType.Name == modelType.ParameterType.Name && x.Key.ParameterType.Namespace == modelType.ParameterType.Namespace))
+                {
+                    alreadyGeneratedList.Add(modelType, _serviceName);
+                    dartString.AppendLine(modelType.GetDartString());
+                }
+                else
+                {
+                    var importService = alreadyGeneratedList.FirstOrDefault(x => x.Key.ParameterType.Name == modelType.ParameterType.Name && x.Key.ParameterType.Namespace == modelType.ParameterType.Namespace).Value;
+                    if (importService == null)
+                    {
+                        throw new Exception("Import Service is null");
+                    }
+                    if (importService != _serviceName && !importServiceList.Contains(importService))
+                    {
+                        importServiceList.Add(importService);
+                    }
+                }
+            }
+            if (string.IsNullOrWhiteSpace(dartString.ToString()))
+            {
+                return null;
+            }
+            var serviceModelDartString = new StringBuilder();
+            foreach (var importService in importServiceList)
+            {
+                serviceModelDartString.AppendLine($"import '{LetterConverterHelper.FirstCharToLower(importService[0..^7])}.m.dart';");
+            }
+            if (importServiceList.Count > 0)
+            {
+                serviceModelDartString.AppendLine();
+            }
+
+            var dartStringInfo = dartString.ToString();
+            if (dartStringInfo.Contains("JsonRpcUtils"))
+            {
+                serviceModelDartString.AppendLine(CodeGenerator.StringUtils);
+                serviceModelDartString.AppendLine();
+            }
+
+            if (dartStringInfo.Contains("FJsonConvert"))
+            {
+                serviceModelDartString.AppendLine(CodeGenerator.StringJsonConvert);
+                serviceModelDartString.AppendLine();
+            }
+            serviceModelDartString.AppendLine(dartStringInfo);
+            return serviceModelDartString.ToString();
+        }
+    }
+}

+ 3 - 3
Program.cs

@@ -3,9 +3,9 @@ using System.IO;
 
 namespace FlutterCodeGenerator
 {
-    class Program
+    internal class Program
     {
-        static void Main(string[] args)
+        private static void Main(string[] args)
         {
             try
             {
@@ -31,4 +31,4 @@ namespace FlutterCodeGenerator
             Console.ReadLine();
         }
     }
-}
+}

+ 10 - 10
ServiceMap.cs

@@ -5,26 +5,26 @@ using System.Text;
 
 namespace FlutterCodeGenerator
 {
-    internal class ServiceMap
+    internal class ServiceMap : IServiceMap
     {
         private List<string> _userDefinedComplexReturnTypeList;
         private string _serviceName;
 
-        public List<MethodMap> MethodMapList;
+        private List<MethodMap> _methodMapList;
 
-        public List<ComplexModelType> UsedComplexModelTypeList;
+        public List<ComplexModelType> UsedComplexModelTypeList { get; }
 
         public ServiceMap(Type type)
         {
             UsedComplexModelTypeList = new List<ComplexModelType>();
             GenerateDataCache.Instance.SetCurrentServiceMap(this);
-            MethodMapList = new List<MethodMap>();
+            _methodMapList = new List<MethodMap>();
             var methodsList = type.GetMethods();
             _serviceName = type.Name[1..];
             foreach (var method in methodsList)
             {
                 var methodMap = new MethodMap(method);
-                MethodMapList.Add(methodMap);
+                _methodMapList.Add(methodMap);
             }
         }
 
@@ -88,10 +88,10 @@ namespace FlutterCodeGenerator
             var serviceDartString = new StringBuilder();
             var importServiceList = new List<string>();
             var alreadyGeneratedList = GenerateDataCache.Instance.AlreadyGeneratedList;
-            foreach (var methodMap in MethodMapList)
+            foreach (var methodMap in _methodMapList)
             {
                 string importService = null;
-                foreach (var modelType in methodMap.ParameterModeTypes)
+                foreach (var modelType in methodMap.ParameterModelTypes)
                 {
                     if (modelType is ComplexModelType)
                     {
@@ -231,7 +231,7 @@ namespace FlutterCodeGenerator
                 serviceDartString.AppendLine("\t}");
             }
             serviceDartString.AppendLine();
-            foreach (var methodMap in MethodMapList)
+            foreach (var methodMap in _methodMapList)
             {
                 serviceDartString.AppendLine(methodMap.GetMethodDartString());
             }
@@ -244,7 +244,7 @@ namespace FlutterCodeGenerator
         public List<string> GetUserDefinedComplexReturnTypeList()
         {
             _userDefinedComplexReturnTypeList = new List<string>();
-            foreach (var method in MethodMapList)
+            foreach (var method in _methodMapList)
             {
                 var veturnParameterModelType = method.ReturnParameterModelType;
                 AddUserDefinedComplexReturnType(veturnParameterModelType);
@@ -254,7 +254,7 @@ namespace FlutterCodeGenerator
 
         private void AddUserDefinedComplexReturnType(ModelType modelType)
         {
-            if (modelType is UserDefinedModeType)
+            if (modelType is UserDefinedModelType)
             {
                 if (!_userDefinedComplexReturnTypeList.Contains(modelType.GetFlutterTypeName()))
                 {