Browse Source

Add DateTime Transfer
Add UserDefined Derived Model Type.

Felix 3 years ago
parent
commit
98602430b5
7 changed files with 400 additions and 77 deletions
  1. 12 2
      CodeGenerator.cs
  2. 1 1
      FlutterCodeGenerator.csproj
  3. 28 4
      MethodMap.cs
  4. 269 25
      ModeType.cs
  5. 80 42
      ModeTypeGenerator.cs
  6. 10 3
      ServiceMap.cs
  7. BIN
      WingInterfaceLibrary.dll

+ 12 - 2
CodeGenerator.cs

@@ -18,6 +18,9 @@ namespace FlutterCodeGenerator
         public static readonly string StringDartCore = "import 'dart:core';";
         public static readonly string StringClientBase = "import 'package:fis_jsonrpc/client_base.dart';";
         public static readonly string StringJsonConvert = "import 'package:fis_common/json_convert.dart';";
+
+        public static readonly string StringUtils = "import 'package:fis_jsonrpc/utils.dart';";
+
         private readonly string _indexDart = "index.dart";
         private readonly string _rpcDart = "rpc.dart";
         private Dictionary<string, ServiceMap> _serviceMapDictionary;
@@ -43,7 +46,7 @@ namespace FlutterCodeGenerator
             }
             var assemblybytes = File.ReadAllBytes(dll);
             var assembly = Assembly.Load(assemblybytes);
-            var interfaceTypes = assembly.GetTypes().Where(x => !x.FullName.Contains("WingInterfaceLibrary.Interface.DBInterface") && x.Name.Contains("Service")).ToList();
+            var interfaceTypes = assembly.GetTypes().Where(x => x.FullName.Contains("Interface") && x.Name.Contains("Service")).ToList();
             foreach (var interfaceType in interfaceTypes)
             {
                 var sericeName = interfaceType.Name[1..];
@@ -74,6 +77,7 @@ namespace FlutterCodeGenerator
                 var serviceString = serviceMap.Value.GetServiceDartString();
                 var serviceModelDartString = serviceMap.Value.GetServiceModelDartString();
                 var serviceDartString = new StringBuilder();
+                var modelDartString = new StringBuilder();
                 serviceDartString.AppendLine(StringDartCore);
                 serviceDartString.AppendLine();
                 serviceDartString.AppendLine(StringClientBase);
@@ -84,7 +88,13 @@ namespace FlutterCodeGenerator
                 serviceDartString.AppendLine();
                 if (serviceModelDartString != null)
                 {
-                    File.WriteAllText(serviceModelDartPath, serviceModelDartString);
+                    if (serviceModelDartString.Contains("DateTime"))
+                    {
+                        modelDartString.AppendLine(StringUtils);
+                        modelDartString.AppendLine();
+                    }
+                    modelDartString.AppendLine(serviceModelDartString);
+                    File.WriteAllText(serviceModelDartPath, modelDartString.ToString());
                     serviceDartString.AppendLine($"import '{serviceModelDartFileName}';");
                 }
                 serviceDartString.AppendLine();

+ 1 - 1
FlutterCodeGenerator.csproj

@@ -15,7 +15,7 @@
 	</ItemGroup>
 
 	<ItemGroup>
-	  <PackageReference Include="WingRpcSDK" Version="1.0.0.6" />
+	  <PackageReference Include="WingRpcSDK" Version="1.0.0.10" />
 	</ItemGroup>
 
 </Project>

+ 28 - 4
MethodMap.cs

@@ -18,13 +18,13 @@ namespace FlutterCodeGenerator
             _methodName = method.Name;
             var returnParameterType = method.ReturnType.GetGenericArguments()[0];
 
-            ReturnParameterModelType = ModelTypeGenerator.Create(returnParameterType, "");
+            ReturnParameterModelType = ModelTypeGenerator.Create(returnParameterType, "", true);
 
             var parameters = method.GetParameters();
             foreach (var parameter in parameters)
             {
                 var parameterType = parameter.ParameterType;
-                var parameterModeType = ModelTypeGenerator.Create(parameterType, parameter.Name);
+                var parameterModeType = ModelTypeGenerator.Create(parameterType, parameter.Name, true);
                 ParameterModeTypes.Add(parameterModeType);
             }
         }
@@ -44,7 +44,7 @@ namespace FlutterCodeGenerator
             {
                 dartString.AppendLine("\t\treturn rpcRst;");
             }
-            else if (ReturnParameterModelType is UserDefinedComplexModeType || ReturnParameterModelType is UserDefinedGenericComplexModelType)
+            else if (ReturnParameterModelType is UserDefinedModeType || ReturnParameterModelType is UserDefinedGenericModelType || ReturnParameterModelType is UserDefinedDerivedModelType)
             {
                 dartString.AppendLine($"\t\tvar result = {ReturnParameterModelType.GetFlutterTypeName()}.fromJson(rpcRst as Map<String, dynamic>);");
                 dartString.AppendLine("\t\treturn result;");
@@ -56,12 +56,36 @@ namespace FlutterCodeGenerator
                     dartString.AppendLine($"\t\tvar result = (rpcRst as List).cast<{simpleModelType.GetFlutterTypeName()}>().toList();");
                     dartString.AppendLine("\t\treturn result;");
                 }
-                else if (genericModelType.GenericArgumentModelType is UserDefinedComplexModeType userDefinedComplexModeType)
+                else if (genericModelType.GenericArgumentModelType is UserDefinedModeType userDefinedComplexModeType)
                 {
                     dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{userDefinedComplexModeType.GetFlutterTypeName()}.fromJson(e as Map<String, dynamic>)).toList();");
                     dartString.AppendLine("\t\treturn result;");
                 }
+                else if (genericModelType.GenericArgumentModelType is UserDefinedDerivedModelType userDefinedDerivedModelType)
+                {
+                    dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{userDefinedDerivedModelType.GetFlutterTypeName()}.fromJson(e as Map<String, dynamic>)).toList();");
+                    dartString.AppendLine("\t\treturn result;");
+                }
             }
+            else if (ReturnParameterModelType is ArrayModelType arrayModelType)
+            {
+                if (arrayModelType.Child is SimpleModelType simpleModelType)
+                {
+                    dartString.AppendLine($"\t\tvar result = (rpcRst as List).cast<{simpleModelType.GetFlutterTypeName()}>().toList();");
+                    dartString.AppendLine("\t\treturn result;");
+                }
+                else if (arrayModelType.Child is UserDefinedModeType userDefinedComplexModeType)
+                {
+                    dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{userDefinedComplexModeType.GetFlutterTypeName()}.fromJson(e as Map<String, dynamic>)).toList();");
+                    dartString.AppendLine("\t\treturn result;");
+                }
+                else if (arrayModelType.Child is UserDefinedDerivedModelType userDefinedDerivedModelType)
+                {
+                    dartString.AppendLine($"\t\tvar result = (rpcRst as List).map((e)=>{userDefinedDerivedModelType.GetFlutterTypeName()}.fromJson(e as Map<String, dynamic>)).toList();");
+                    dartString.AppendLine("\t\treturn result;");
+                }
+            }
+
             dartString.AppendLine("\t}");
             return dartString.ToString();
         }

+ 269 - 25
ModeType.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using System.Text;
 
 namespace FlutterCodeGenerator
@@ -85,6 +86,19 @@ namespace FlutterCodeGenerator
         }
     }
 
+    public class ByteModelType : SimpleModelType
+    {
+        public ByteModelType(string name) : base(typeof(byte), name)
+        {
+            DefaultValue = "0";
+        }
+
+        public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
+        {
+            return "int";
+        }
+    }
+
     public class DoubleModeType : SimpleModelType
     {
         public DoubleModeType(string name) : base(typeof(int), name)
@@ -111,6 +125,13 @@ namespace FlutterCodeGenerator
         }
     }
 
+    public class ExtraObjectModelType : SimpleModelType
+    {
+        public ExtraObjectModelType(Type type, string name) : base(type, name)
+        {
+        }
+    }
+
     public class ComplexModelType : ModelType
     {
         public List<ModelType> Children { get; set; }
@@ -120,7 +141,7 @@ namespace FlutterCodeGenerator
             Children = new List<ModelType>();
         }
 
-        protected string ToJson(List<ModelType> Children)
+        protected virtual string ToJson(List<ModelType> Children)
         {
             var source = new StringBuilder();
             source.AppendLine("\tMap<String, dynamic> toJson() {");
@@ -135,6 +156,11 @@ namespace FlutterCodeGenerator
                 {
                     source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};");
                 }
+                else if (child is DateTimeModeType)
+                {
+                    source.AppendLine($"\t\tif({child.Name_Lower} != null)");
+                    source.AppendLine($"\t\t\tmap['{child.Name_Upper}'] = JsonRpcUtils.dateFormat({child.Name_Lower}!);");
+                }
                 else
                 {
                     source.AppendLine($"\t\tif({child.Name_Lower} != null)");
@@ -146,11 +172,11 @@ namespace FlutterCodeGenerator
             return source.ToString();
         }
 
-        protected string FromJson(List<ModelType> Children)
+        protected virtual string FromJson(List<ModelType> Children)
         {
             var source = new StringBuilder();
             string flutterTypeName = null;
-            if (this is UserDefinedGenericComplexModelType)
+            if (this is UserDefinedGenericModelType)
             {
                 flutterTypeName = GetFlutterTypeName(false, false, true);
             }
@@ -168,7 +194,7 @@ namespace FlutterCodeGenerator
                 }
                 else if (child is ListModelType listModelType)
                 {
-                    if (this is UserDefinedGenericComplexModelType type)
+                    if (this is UserDefinedGenericModelType type)
                     {
                         if (type.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType)
                         {
@@ -179,10 +205,21 @@ namespace FlutterCodeGenerator
                             source.AppendLine($"\t\t}}");
                         }
                     }
+                    else if (this is UserDefinedDerivedModelType derivedModelType && derivedModelType.BaseType is UserDefinedGenericModelType baseType)
+                    {
+                        if (baseType.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType)
+                        {
+                            source.AppendLine($"\t\tList<{listModelType.GenericArgumentModelType.GetFlutterTypeName()}> {listModelType.Name_Lower}List = [];");
+                            source.AppendLine($"\t\tif (map['{listModelType.Name_Upper}'] != null) {{");
+                            source.AppendLine($"\t\t\t{listModelType.Name_Lower}List.addAll(");
+                            source.AppendLine($"\t\t\t\t\t(map['{listModelType.Name_Upper}'] as List).map((e) => FJsonConvert.fromJson<{listModelType.GenericArgumentModelType.GetFlutterTypeName()}>(e)!));");
+                            source.AppendLine($"\t\t}}");
+                        }
+                    }
                 }
-                else if (child is UserDefinedGenericComplexModelType userDefinedGenericComplexModelType)
+                else if (child is UserDefinedGenericModelType userDefinedGenericComplexModelType)
                 {
-                    if (this is UserDefinedGenericComplexModelType type)
+                    if (this is UserDefinedGenericModelType type)
                     {
                         if (type.GenericArgumentModelType.ParameterType == userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType)
                         {
@@ -192,6 +229,17 @@ namespace FlutterCodeGenerator
                             source.AppendLine($"\t\t\t\t\t(map['{userDefinedGenericComplexModelType.Name_Upper}'] as List).map((e) => FJsonConvert.fromJson<T>(e)!));");
                             source.AppendLine($"\t\t}}");
                         }
+                        else if (this is UserDefinedDerivedModelType derivedModelType && derivedModelType.BaseType is UserDefinedGenericModelType baseType)
+                        {
+                            if (baseType.GenericArgumentModelType.ParameterType == userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType)
+                            {
+                                source.AppendLine($"\t\tList<{userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType}> {userDefinedGenericComplexModelType.Name_Lower}List = [];");
+                                source.AppendLine($"\t\tif (map['{userDefinedGenericComplexModelType.Name_Upper}'] != null) {{");
+                                source.AppendLine($"\t\t\t{userDefinedGenericComplexModelType.Name_Lower}List.addAll(");
+                                source.AppendLine($"\t\t\t\t\t(map['{userDefinedGenericComplexModelType.Name_Upper}'] as List).map((e) => FJsonConvert.fromJson<{userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType}>(e)!));");
+                                source.AppendLine($"\t\t}}");
+                            }
+                        }
                     }
                 }
             }
@@ -204,17 +252,20 @@ namespace FlutterCodeGenerator
                 }
                 else if (child is ArrayModelType)
                 {
-
                     var arrayTypeName = child.ParameterType.FullName.Replace("[]", string.Empty);
                     var arrayType = child.ParameterType.Assembly.GetType(arrayTypeName);
                     var modelType = ModelTypeGenerator.Create(arrayType, "");
-                    if (modelType is SimpleModelType)
+                    if (modelType is ByteModelType)
                     {
-                        source.AppendLine($"\t\t\t{child.Name_Lower}: {child.Name_Lower}Data != null ? ({child.Name_Lower}Data as List).map((e) => e as {child.ParameterType.Name.Replace("[]", string.Empty)}).toList(): const [],");
+                        source.AppendLine($"\t\t\t{child.Name_Lower}: {child.Name_Lower}Data != null ? ({child.Name_Lower}Data as List).map((e) => e as int).toList(): null,");
+                    }
+                    else if (modelType is SimpleModelType)
+                    {
+                        source.AppendLine($"\t\t\t{child.Name_Lower}: {child.Name_Lower}Data != null ? ({child.Name_Lower}Data as List).map((e) => e as {child.ParameterType.Name.Replace("[]", string.Empty)}).toList(): null,");
                     }
                     else
                     {
-                        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 [],");
+                        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)
@@ -223,7 +274,7 @@ namespace FlutterCodeGenerator
                 }
                 else if (child is ListModelType listModelType)
                 {
-                    if (this is UserDefinedGenericComplexModelType type)
+                    if (this is UserDefinedGenericModelType type)
                     {
                         if (type.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType)
                         {
@@ -240,7 +291,24 @@ namespace FlutterCodeGenerator
                             source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'].map((e)=>{model}.fromJson(e as Map<String,dynamic>)).toList(),");
                         }
                     }
-                    else if (this is UserDefinedComplexModeType)
+                    else if (this is UserDefinedDerivedModelType definedDerivedModelType && definedDerivedModelType.BaseType is UserDefinedGenericModelType baseType)
+                    {
+                        if (baseType.GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType)
+                        {
+                            source.AppendLine($"\t\t\t{child.Name_Lower}: {listModelType.Name_Lower}List,");
+                        }
+                        else if (listModelType.GenericArgumentModelType is SimpleModelType)
+                        {
+                            var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
+                            source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'].cast<{model}>().toList(),");
+                        }
+                        else
+                        {
+                            var model = listModelType.GenericArgumentModelType.GetFlutterTypeName();
+                            source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'].map((e)=>{model}.fromJson(e as Map<String,dynamic>)).toList(),");
+                        }
+                    }
+                    else if (this is UserDefinedModeType || this is UserDefinedDerivedModelType)
                     {
                         if (listModelType.GenericArgumentModelType is SimpleModelType)
                         {
@@ -260,9 +328,9 @@ namespace FlutterCodeGenerator
                     var argumentName2 = dictionaryModelType.GenericArgumentModelTypeList[1].GetFlutterTypeName();
                     source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'].cast<{argumentName1},{argumentName2}>(),");
                 }
-                else if (child is UserDefinedGenericComplexModelType userDefinedGenericComplexModelType)
+                else if (child is UserDefinedGenericModelType userDefinedGenericComplexModelType)
                 {
-                    if (this is UserDefinedGenericComplexModelType type)
+                    if (this is UserDefinedGenericModelType type)
                     {
                         if (type.GenericArgumentModelType.ParameterType == userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType)
                         {
@@ -279,7 +347,7 @@ namespace FlutterCodeGenerator
                             source.AppendLine($"\t\t\t{child.Name_Lower}: map['{child.Name_Upper}'].map((e)=>{model}.fromJson(e as Map<String,dynamic>)).toList(),");
                         }
                     }
-                    else if (this is UserDefinedComplexModeType)
+                    else if (this is UserDefinedModeType)
                     {
                         if (userDefinedGenericComplexModelType.GenericArgumentModelType is SimpleModelType)
                         {
@@ -328,16 +396,18 @@ namespace FlutterCodeGenerator
 
     public class ArrayModelType : SimpleModelType
     {
+        public ModelType Child;
         public ArrayModelType(Type type, string name) : base(type, name)
         {
             var arrayTypeName = ParameterType.FullName.Replace("[]", string.Empty);
             var arrayType = ParameterType.Assembly.GetType(arrayTypeName);
-            ModelTypeGenerator.Create(arrayType, "");
+            Child = ModelTypeGenerator.Create(arrayType, "");
         }
 
         public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
         {
-            return $"List<{ParameterType.Name[0..^2]}>";
+            var parameterTypeName = Child.GetFlutterTypeName();
+            return $"List<{parameterTypeName}>";
         }
     }
 
@@ -408,11 +478,11 @@ namespace FlutterCodeGenerator
     /// <summary>
     /// User Defined Generic Complex Model Type
     /// </summary>
-    public class UserDefinedGenericComplexModelType : ComplexModelType
+    public class UserDefinedGenericModelType : ComplexModelType
     {
         public ModelType GenericArgumentModelType;
 
-        public UserDefinedGenericComplexModelType(Type type, string name) : base(type, name)
+        public UserDefinedGenericModelType(Type type, string name) : base(type, name)
         {
             var properties = type.GetProperties();
             foreach (var property in properties)
@@ -456,7 +526,7 @@ namespace FlutterCodeGenerator
                 {
                     argumentName = GenericArgumentModelType.ParameterType == listModelType.GenericArgumentModelType.ParameterType ? listModelType.GetFlutterTypeName(false, true) : listModelType.GetFlutterTypeName();
                 }
-                else if (child is UserDefinedGenericComplexModelType userDefinedGenericComplexModelType)
+                else if (child is UserDefinedGenericModelType userDefinedGenericComplexModelType)
                 {
                     argumentName = GenericArgumentModelType.ParameterType == userDefinedGenericComplexModelType.GenericArgumentModelType.ParameterType ? userDefinedGenericComplexModelType.GetFlutterTypeName(false, true) : userDefinedGenericComplexModelType.GetFlutterTypeName();
                 }
@@ -472,7 +542,7 @@ namespace FlutterCodeGenerator
             {
                 if (child.DefaultValue != null)
                 {
-                    dartString.AppendLine($"\t\tthis.{child.Name_Lower}={child.DefaultValue},");
+                    dartString.AppendLine($"\t\tthis.{child.Name_Lower} = {child.DefaultValue},");
                 }
                 else
                 {
@@ -488,9 +558,9 @@ namespace FlutterCodeGenerator
         }
     }
 
-    public class UserDefinedComplexModeType : ComplexModelType
+    public class UserDefinedModeType : ComplexModelType
     {
-        public UserDefinedComplexModeType(Type type, string name) : base(type, name)
+        public UserDefinedModeType(Type type, string name) : base(type, name)
         {
             var properties = type.GetProperties();
             foreach (var property in properties)
@@ -512,7 +582,7 @@ namespace FlutterCodeGenerator
             foreach (var child in Children)
             {
                 var questionMark = QuestionMarkCheck(child);
-                if (child is ListModelType || child is DictionaryModelType || child is UserDefinedGenericComplexModelType)
+                if (child is ListModelType || child is DictionaryModelType || child is UserDefinedGenericModelType)
                 {
                     dartString.AppendLine($"\t{child.GetFlutterTypeName(false, false)}{questionMark} {child.Name_Lower};");
                 }
@@ -527,7 +597,7 @@ namespace FlutterCodeGenerator
             {
                 if (child.DefaultValue != null)
                 {
-                    dartString.AppendLine($"\t\tthis.{child.Name_Lower}={child.DefaultValue},");
+                    dartString.AppendLine($"\t\tthis.{child.Name_Lower} = {child.DefaultValue},");
                 }
                 else
                 {
@@ -543,4 +613,178 @@ namespace FlutterCodeGenerator
             return dartString.ToString();
         }
     }
+
+    public class UserDefinedDerivedModelType : ComplexModelType
+    {
+        public ModelType BaseType;
+
+        public UserDefinedDerivedModelType(Type type, string name) : base(type, name)
+        {
+            BaseType = ModelTypeGenerator.Create(type.BaseType, "");
+            var properties = type.GetProperties();
+            foreach (var property in properties)
+            {
+                var child = ModelTypeGenerator.Create(property.PropertyType, property.Name);
+                Children.Add(child);
+            }
+        }
+
+        public override string GetFlutterTypeName(bool isDefault = true, bool isGenericName = false, bool isSingle = false)
+        {
+            return $"{ParameterType.Name}";
+        }
+
+        public override string GetDartString()
+        {
+            var dartString = new StringBuilder();
+            dartString.AppendLine($"class {GetFlutterTypeName()} extends {BaseType.GetFlutterTypeName()}{{");
+            var baseType = BaseType as ComplexModelType;
+            foreach (var child in Children)
+            {
+                if (baseType != null)
+                {
+                    if (!baseType.Children.Any(x => x.ParameterType == child.ParameterType && x.Name_Upper == child.Name_Upper))
+                    {
+                        var questionMark = QuestionMarkCheck(child);
+                        if (child is ListModelType || child is DictionaryModelType || child is UserDefinedGenericModelType)
+                        {
+                            dartString.AppendLine($"\t{child.GetFlutterTypeName(false, false)}{questionMark} {child.Name_Lower};");
+                        }
+                        else
+                        {
+                            dartString.AppendLine($"\t{child.GetFlutterTypeName()}{questionMark} {child.Name_Lower};");
+                        }
+                    }
+                    else
+                    {
+                        continue;
+                    }
+                }
+                else
+                {
+                    var questionMark = QuestionMarkCheck(child);
+                    if (child is ListModelType || child is DictionaryModelType || child is UserDefinedGenericModelType)
+                    {
+                        dartString.AppendLine($"\t{child.GetFlutterTypeName(false, false)}{questionMark} {child.Name_Lower};");
+                    }
+                    else
+                    {
+                        dartString.AppendLine($"\t{child.GetFlutterTypeName()}{questionMark} {child.Name_Lower};");
+                    }
+                }
+            }
+            dartString.AppendLine();
+            dartString.AppendLine($"\t{GetFlutterTypeName()}({{");
+            foreach (var child in Children)
+            {
+                if (baseType != null)
+                {
+                    if (baseType.Children.Any(x => x.ParameterType == child.ParameterType && x.Name_Upper == child.Name_Upper))
+                    {
+                        var questionMark = QuestionMarkCheck(child);
+                        if (child.DefaultValue != null)
+                        {
+                            if (child is ListModelType || child is DictionaryModelType || child is UserDefinedGenericModelType)
+                            {
+                                dartString.AppendLine($"\t\t{child.GetFlutterTypeName(false, false)}{questionMark} {child.Name_Lower} = {child.DefaultValue},");
+                            }
+                            else
+                            {
+                                dartString.AppendLine($"\t\t{child.GetFlutterTypeName()}{questionMark} {child.Name_Lower} = {child.DefaultValue},");
+                            }
+                        }
+                        else
+                        {
+                            if (child is ListModelType || child is DictionaryModelType || child is UserDefinedGenericModelType)
+                            {
+                                dartString.AppendLine($"\t\t{child.GetFlutterTypeName(false, false)}{questionMark} {child.Name_Lower},");
+                            }
+                            else
+                            {
+                                dartString.AppendLine($"\t\t{child.GetFlutterTypeName()}{questionMark} {child.Name_Lower},");
+                            }
+                        }
+                    }
+                    else
+                    {
+                        if (child.DefaultValue != null)
+                        {
+                            dartString.AppendLine($"\t\tthis.{child.Name_Lower} = {child.DefaultValue},");
+                        }
+                        else
+                        {
+                            dartString.AppendLine($"\t\tthis.{child.Name_Lower},");
+                        }
+                    }
+                }
+                else
+                {
+                    if (child.DefaultValue != null)
+                    {
+                        dartString.AppendLine($"\t\tthis.{child.Name_Lower} = {child.DefaultValue},");
+                    }
+                    else
+                    {
+                        dartString.AppendLine($"\t\tthis.{child.Name_Lower},");
+                    }
+                }
+            }
+            if (baseType != null)
+            {
+                dartString.AppendLine($"\t}}) : super(");
+                foreach (var child in baseType.Children)
+                {
+                    dartString.AppendLine($"\t\t\t{child.Name_Lower}: {child.Name_Lower},");
+                }
+                dartString.AppendLine($"\t\t);");
+            }
+            else
+            {
+                dartString.AppendLine("\t});");
+            }
+
+            dartString.AppendLine();
+            dartString.Append(FromJson(Children));
+            dartString.Append(ToJson(Children));
+            dartString.AppendLine("}");
+            return dartString.ToString();
+        }
+
+        protected override string ToJson(List<ModelType> Children)
+        {
+            var source = new StringBuilder();
+            source.AppendLine("\tMap<String, dynamic> toJson() {");
+            source.AppendLine("\t\tfinal map = super.toJson();");
+            foreach (var child in Children)
+            {
+                if (BaseType is ComplexModelType complexModelType)
+                {
+                    if (!complexModelType.Children.Any(x => x.ParameterType == child.ParameterType && x.Name_Upper == child.Name_Upper))
+                    {
+                        if (child is EnumModeType)
+                        {
+                            source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower}.index;");
+                        }
+                        else if (child.DefaultValue != null)
+                        {
+                            source.AppendLine($"\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};");
+                        }
+                        else if (child is DateTimeModeType)
+                        {
+                            source.AppendLine($"\t\tif({child.Name_Lower} != null)");
+                            source.AppendLine($"\t\t\tmap['{child.Name_Upper}'] = JsonRpcUtils.dateFormat({child.Name_Lower}!);");
+                        }
+                        else
+                        {
+                            source.AppendLine($"\t\tif({child.Name_Lower} != null)");
+                            source.AppendLine($"\t\t\tmap['{child.Name_Upper}'] = {child.Name_Lower};");
+                        }
+                    }
+                }
+            }
+            source.AppendLine("\t\treturn map;");
+            source.AppendLine("\t}");
+            return source.ToString();
+        }
+    }
 }

+ 80 - 42
ModeTypeGenerator.cs

@@ -1,61 +1,103 @@
 using System;
+using System.Collections.Generic;
 using System.Linq;
 
 namespace FlutterCodeGenerator
 {
     public class ModelTypeGenerator
     {
-        public static ModelType Create(Type type, string argName)
+
+        public static Dictionary<Type, int> _tempTypes = new Dictionary<Type, int>();
+
+        public static ModelType Create(Type type, string argName, bool clearTypes = false)
         {
-            if (type == typeof(int) || type == typeof(long) || type == typeof(short))
-            {
-                return new IntModeType(argName);
-            }
-            else if (type == typeof(float) || type == typeof(double))
+            if (clearTypes)
             {
-                return new DoubleModeType(argName);
+                _tempTypes.Clear();
             }
-            else if (type == typeof(bool))
+            if ((_tempTypes.ContainsKey(type) && _tempTypes[type] < 2) || !_tempTypes.ContainsKey(type))
             {
-                return new BoolModeType(argName);
-            }
-            else if (type == typeof(string) || type == typeof(char))
-            {
-                return new StringModeType(argName);
-            }
-            else if (type == typeof(DateTime))
-            {
-                return new DateTimeModeType(argName);
-            }
-            else if (type.IsEnum)
-            {
-                var modelType = new EnumModeType(type, argName);
-                if (!ServiceMap.TemporaryList.Any(x => x.ParameterType == type))
+                var duplicatedTime = 0;
+                if (_tempTypes.ContainsKey(type))
                 {
-                    ServiceMap.TemporaryList.Add(modelType);
+                    duplicatedTime = _tempTypes[type];
                 }
-                return modelType;
-            }
-            else if (type.IsArray)
-            {
-                var modelType = new ArrayModelType(type, argName);
-                return modelType;
-            }
-            else if (type.IsGenericType)
-            {
-                if (type.Name == "List`1")
+                duplicatedTime++;
+                if (type == typeof(int) || type == typeof(long) || type == typeof(short))
+                {
+                    return new IntModeType(argName);
+                }
+                else if (type == typeof(float) || type == typeof(double))
+                {
+                    return new DoubleModeType(argName);
+                }
+                else if (type == typeof(bool))
+                {
+                    return new BoolModeType(argName);
+                }
+                else if (type == typeof(string) || type == typeof(char))
                 {
-                    var modelType = new ListModelType(type, argName);
+                    return new StringModeType(argName);
+                }
+                else if (type == typeof(DateTime))
+                {
+                    return new DateTimeModeType(argName);
+                }
+                else if (type == typeof(byte))
+                {
+                    return new ByteModelType(argName);
+                }
+                else if (type.IsEnum)
+                {
+                    var modelType = new EnumModeType(type, argName);
+                    if (!ServiceMap.TemporaryList.Any(x => x.ParameterType == type))
+                    {
+                        ServiceMap.TemporaryList.Add(modelType);
+                    }
+                    return modelType;
+                }
+                else if (type.IsArray)
+                {
+                    var modelType = new ArrayModelType(type, argName);
                     return modelType;
                 }
-                else if (type.Name == "Dictionary`2")
+                else if (type.BaseType != typeof(object))
                 {
-                    var modelType = new DictionaryModelType(type, argName);
+                    _tempTypes[type] = duplicatedTime;
+                    var modelType = new UserDefinedDerivedModelType(type, argName);
+                    if (!ServiceMap.TemporaryList.Any(x => x.ParameterType == type))
+                    {
+                        ServiceMap.TemporaryList.Add(modelType);
+                    }
                     return modelType;
                 }
+                else if (type.IsGenericType)
+                {
+                    if (type.Name == "List`1")
+                    {
+                        var modelType = new ListModelType(type, argName);
+                        return modelType;
+                    }
+                    else if (type.Name == "Dictionary`2")
+                    {
+                        var modelType = new DictionaryModelType(type, argName);
+                        return modelType;
+                    }
+                    else
+                    {
+                        _tempTypes[type] = duplicatedTime;
+                        var modelType = new UserDefinedGenericModelType(type, argName);
+                        if (!ServiceMap.TemporaryList.Any(x => x.ParameterType == type))
+                        {
+                            ServiceMap.TemporaryList.Add(modelType);
+                        }
+                        return modelType;
+                    }
+                }
                 else
                 {
-                    var modelType = new UserDefinedGenericComplexModelType(type, argName);
+                    _tempTypes[type] = duplicatedTime;
+                    var modelType = new UserDefinedModeType(type, argName);
                     if (!ServiceMap.TemporaryList.Any(x => x.ParameterType == type))
                     {
                         ServiceMap.TemporaryList.Add(modelType);
@@ -65,11 +107,7 @@ namespace FlutterCodeGenerator
             }
             else
             {
-                var modelType = new UserDefinedComplexModeType(type, argName);
-                if (!ServiceMap.TemporaryList.Any(x => x.ParameterType == type))
-                {
-                    ServiceMap.TemporaryList.Add(modelType);
-                }
+                var modelType = new ExtraObjectModelType(type, "");
                 return modelType;
             }
         }

+ 10 - 3
ServiceMap.cs

@@ -37,7 +37,7 @@ namespace FlutterCodeGenerator
             var dartString = new StringBuilder();
             foreach (var modelType in _usedComplexModelTypeList)
             {
-                if (modelType is UserDefinedGenericComplexModelType)
+                if (modelType is UserDefinedGenericModelType)
                 {
                     var genericType = modelType.ParameterType.GetGenericTypeDefinition();
                     if (!_userDefinedGenericTypeList.Contains(genericType))
@@ -120,14 +120,21 @@ namespace FlutterCodeGenerator
 
         private void AddUserDefinedComplexReturnType(ModelType modelType)
         {
-            if (modelType is UserDefinedComplexModeType)
+            if (modelType is UserDefinedModeType)
             {
                 if (!_userDefinedComplexReturnTypeList.Contains(modelType.GetFlutterTypeName()))
                 {
                     _userDefinedComplexReturnTypeList.Add(modelType.GetFlutterTypeName());
                 }
             }
-            else if (modelType is UserDefinedGenericComplexModelType userDefinedGenericComplexModelType)
+            else if (modelType is UserDefinedDerivedModelType)
+            {
+                if (!_userDefinedComplexReturnTypeList.Contains(modelType.GetFlutterTypeName()))
+                {
+                    _userDefinedComplexReturnTypeList.Add(modelType.GetFlutterTypeName());
+                }
+            }
+            else if (modelType is UserDefinedGenericModelType userDefinedGenericComplexModelType)
             {
                 if (!_userDefinedComplexReturnTypeList.Contains(userDefinedGenericComplexModelType.GetFlutterTypeName()))
                 {

BIN
WingInterfaceLibrary.dll