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 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 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); } }