private void GenIsTypeFunc(CodePrinter prtDecl, CodePrinter prtImpl, bool currIsObject) { if (CurrType.IsValueType || !CurrType.NeedGenIsType) { return; } CodePrinter prt = new CodePrinter(); prt.AppendFormat("uint8_t {0}(uint32_t typeID)", GenContext.GetIsTypeFuncName(CurrType)); string strDecl = prt.ToString() + ";\n"; prt.AppendLine("\n{"); ++prt.Indents; var derivedRange = new List <TypeX>(CurrType.DerivedTypes); derivedRange.Add(CurrType); List <TypeX> derTypes = new List <TypeX>(); foreach (var derTyX in derivedRange) { // 跳过不分配在堆上的类型 if (!derTyX.IsInstantiated || derTyX.Def.IsInterface) { continue; } // 如果当前类型是 object, 则跳过值类型 if (currIsObject && derTyX.IsValueType) { continue; } derTypes.Add(derTyX); } if (derTypes.Count > 0) { prt.AppendLine("switch (typeID)\n{"); ++prt.Indents; derTypes.Sort((lhs, rhs) => GenContext.GetTypeID(lhs).CompareTo(GenContext.GetTypeID(rhs))); foreach (var derTyX in derTypes) { prt.AppendFormatLine("// {0}", Helper.EscapeString(derTyX.GetNameKey())); prt.AppendFormatLine("case {0}:", GenContext.GetTypeID(derTyX)); } ++prt.Indents; prt.AppendLine("return 1;"); --prt.Indents; --prt.Indents; prt.AppendLine("}"); } prt.AppendLine("return 0;"); --prt.Indents; prt.AppendLine("}"); prtDecl.Append(strDecl); prtImpl.Append(prt.ToString()); }