public new void AsCsvRow(CsvWriter writer, bool bulk = true)
        {
            base.AsCsvRow(writer, bulk);

            writer.WriteField(Title);
            writer.WriteField(String.Join(',', Grades));
            writer.WriteField(CourseId);
            writer.WriteField(IMSClassCode);
            writer.WriteField(IMSClassType);
            writer.WriteField(Location);
            writer.WriteField(SchoolOrgId);
            writer.WriteField(String.Join(',', IMSClassAcademicSessions.Select(kas => kas.AcademicSessionId)));
            writer.WriteField(String.Join(',', Subjects));
            writer.WriteField(String.Join(',', SubjectCodes));
            writer.WriteField(String.Join(',', Periods));

            writer.NextRecord();
        }
        public new void AsJson(JsonWriter writer, string baseUrl)
        {
            writer.WriteStartObject();
            base.AsJson(writer, baseUrl);

            writer.WritePropertyName("title");
            writer.WriteValue(Title);

            if (!String.IsNullOrEmpty(IMSClassCode))
            {
                writer.WritePropertyName("classCode");
                writer.WriteValue(IMSClassCode);
            }

            writer.WritePropertyName("classType");
            writer.WriteValue(Enum.GetName(typeof(IMSClassType), IMSClassType));

            if (!String.IsNullOrEmpty(Location))
            {
                writer.WritePropertyName("location");
                writer.WriteValue(Location);
            }

            if (Grades != null && Grades.Length > 0)
            {
                writer.WritePropertyName("grades");
                writer.WriteStartArray();
                foreach (var grade in Grades)
                {
                    writer.WriteValue(grade);
                }
                writer.WriteEndArray();
            }

            if (Subjects != null && Subjects.Length > 0)
            {
                writer.WritePropertyName("subjects");
                writer.WriteStartArray();
                foreach (var subject in Subjects)
                {
                    writer.WriteValue(subject);
                }
                writer.WriteEndArray();
            }

            if (Course != null)
            {
                writer.WritePropertyName("course");
                Course.AsJsonReference(writer, baseUrl);
            }

            writer.WritePropertyName("resources");
            writer.WriteStartArray();
            if (Course != null && Course.Resources != null)
            {
                foreach (var resource in Course.Resources)
                {
                    writer.WriteValue(resource);
                }
            }
            if (Resources != null)
            {
                foreach (var resource in Resources)
                {
                    writer.WriteValue(resource);
                }
            }
            writer.WriteEndArray();

            if (School != null)
            {
                writer.WritePropertyName("school");
                School.AsJsonReference(writer, baseUrl);
            }

            writer.WritePropertyName("terms");
            writer.WriteStartArray();
            if (IMSClassAcademicSessions != null)
            {
                IMSClassAcademicSessions.ForEach(join => join.AcademicSession.AsJsonReference(writer, baseUrl));
            }
            writer.WriteEndArray();

            if (SubjectCodes != null && SubjectCodes.Length > 0)
            {
                writer.WritePropertyName("subjectCodes");
                writer.WriteStartArray();
                foreach (var subjectCode in SubjectCodes)
                {
                    writer.WriteValue(subjectCode);
                }
                writer.WriteEndArray();
            }

            if (Periods != null && Periods.Length > 0)
            {
                writer.WritePropertyName("periods");
                writer.WriteStartArray();
                foreach (var period in Periods)
                {
                    writer.WriteValue(period);
                }
                writer.WriteEndArray();
            }

            writer.WriteEndObject();
            writer.Flush();
        }