/// <param name="type"> The class to introspect </param> /// <param name="recursive"> If true, goes does the hierarchy to try to analyze all classes </param> /// <param name="classInfoList"> map with class name that are being introspected, to avoid recursive calls </param> private static ClassInfoList InternalIntrospect(Type type, bool recursive, ClassInfoList classInfoList) { if (classInfoList != null) { var existingClassInfo = classInfoList.GetClassInfoBy(type); if (existingClassInfo != null) { return(classInfoList); } } var classInfo = new ClassInfo(type); if (classInfoList == null) { classInfoList = new ClassInfoList(classInfo); } else { classInfoList.AddClassInfo(classInfo); } var fields = GetAllFieldsFrom(type); var attributes = new OdbList <ClassAttributeInfo>(fields.Count); for (var i = 0; i < fields.Count; i++) { var field = fields[i]; ClassInfo classInfoByName; if (OdbType.GetFromClass(field.FieldType).IsNative()) { classInfoByName = null; } else { if (recursive) { classInfoList = InternalIntrospect(field.FieldType, true, classInfoList); classInfoByName = classInfoList.GetClassInfoBy(field.FieldType); } else { classInfoByName = new ClassInfo(field.FieldType); } } attributes.Add(new ClassAttributeInfo((i + 1), field.Name, field.FieldType, OdbClassNameResolver.GetFullName(field.FieldType), classInfoByName)); } classInfo.Attributes = attributes; classInfo.MaxAttributeId = fields.Count; return(classInfoList); }
/// <param name="type"> The class to introspect </param> /// <param name="recursive"> If true, goes does the hierarchy to try to analyze all classes </param> /// <param name="classInfoList"> map with class name that are being introspected, to avoid recursive calls </param> private static ClassInfoList InternalIntrospect(Type type, bool recursive, ClassInfoList classInfoList) { if (classInfoList != null) { var existingClassInfo = classInfoList.GetClassInfoBy(type); if (existingClassInfo != null) return classInfoList; } var classInfo = new ClassInfo(type); if (classInfoList == null) classInfoList = new ClassInfoList(classInfo); else classInfoList.AddClassInfo(classInfo); var fields = GetAllFieldsFrom(type); var attributes = new OdbList<ClassAttributeInfo>(fields.Count); for (var i = 0; i < fields.Count; i++) { var field = fields[i]; ClassInfo classInfoByName; if (OdbType.GetFromClass(field.FieldType).IsNative()) { classInfoByName = null; } else { if (recursive) { classInfoList = InternalIntrospect(field.FieldType, true, classInfoList); classInfoByName = classInfoList.GetClassInfoBy(field.FieldType); } else classInfoByName = new ClassInfo(field.FieldType); } attributes.Add(new ClassAttributeInfo((i + 1), field.Name, field.FieldType, OdbClassNameResolver.GetFullName(field.FieldType), classInfoByName)); } classInfo.Attributes = attributes; classInfo.MaxAttributeId = fields.Count; return classInfoList; }