public static void TraversGenList(TraversStrategy strategy, MethodBuilder sink, Type elemType, string prefix, bool isArray)
 {
     strategy.start?.Invoke(sink, false);
     sink.content($"var size = {prefix}.{(isArray ? "Length" : "Count")};");
     sink.content($"for (int i = 0; i < size; i++)");
     sink.content($"{{");
     sink.indent++;
     strategy.elemProcess(sink, new DataInfo {
         type = elemType, baseAccess = $"{prefix}[i]"
     });
     sink.indent--;
     sink.content($"}}");
     strategy.finish?.Invoke(sink);
 }
 public static void TraverseGenDict(TraversStrategy strategy, MethodBuilder sink, Type keyType, Type valType, string path)
 {
     strategy.start?.Invoke(sink, false);
     sink.content($"foreach (var item in {path})");
     sink.content($"{{");
     sink.indent++;
     if (strategy.needDictKeyTraverse)
     {
         strategy.elemProcess(sink, new DataInfo {
             type = keyType, baseAccess = "item.Key"
         });
     }
     strategy.elemProcess(sink, new DataInfo {
         type = valType, baseAccess = "item.Value"
     });
     sink.indent--;
     sink.content($"}}");
     strategy.finish?.Invoke(sink);
 }
        public static void TraverseGenCustomType(TraversStrategy strategy, Type type, string funcPrefix)
        {
            var sink = MakeGenMethod(type, strategy.flag, funcPrefix + strategy.funcName, strategy.funcReturnType ?? Void, strategy.funcArgs ?? "");

            if (type.IsList() || type.IsArray)
            {
                var elemType = type.FirstGenericArg();
                RequestGen(elemType, strategy.flag);
                TraversGenList(strategy, sink, elemType, type.AccessPrefixInGeneratedFunction(), type.IsArray);
            }
            else if (type.IsDictionary())
            {
                var elemType = type.FirstGenericArg();
                var keyType  = type.SecondGenericArg();
                RequestGen(elemType, strategy.flag);
                RequestGen(keyType, strategy.flag);
                TraverseGenDict(strategy, sink, elemType, keyType, type.AccessPrefixInGeneratedFunction());
            }
            else
            {
                if (strategy.interfaceType != null && type.IsControllable())
                {
                    sink.classBuilder.inheritance(strategy.interfaceType.Name);
                }

                strategy.start?.Invoke(sink, type.NeedBaseCallForFlag(strategy.flag));
                type.ProcessMembers(strategy.flag, strategy.needMembersGenRequest, member =>
                {
                    if (strategy.memberPredicate == null || strategy.memberPredicate(member))
                    {
                        strategy.elemProcess(sink, member);
                    }
                });
                strategy.finish?.Invoke(sink);
            }
        }