internal void ReadField(object target, string fieldName, MemberInfo memberInfo, int depth) { if (typeof(Compound).IsAssignableFrom(memberInfo.FieldType)) { string firstProperty = memberInfo.FieldNames.First(); // Create new compound property when // - no compound property was started // - OR when the property that is being read is the first property of new or current compound property if (compoundFields[depth] == null || firstProperty == fieldName) { // Inform previous compound property it is complete if (compoundFields[depth] != null) { compoundFields[depth].OnComplete(this, depth + 1); } compoundFields[depth] = (Compound)Context.CreateField(memberInfo.FieldType); compoundFields[depth].OnCreate(this, depth + 1); memberInfo.SetOrAddValue(target, compoundFields[depth]); } compoundFields[depth].ReadCompoundField(this, fieldName, depth + 1); } else { // Inform current compound property it is complete // and finish it // when non-compund property is being read if (compoundFields[depth] != null) { compoundFields[depth].OnComplete(this, depth + 1); } memberInfo.SetOrAddValue(target, ReadPrimitiveFieldValue(memberInfo)); } }