public virtual TResult Accept(IPropertyWalkerVisitor <TResult, TWalkInfo> visitor, TWalkInfo walkInfo) { walkInfo.WalkedTypes.Add(walkInfo.Type); var fieldFirstParts = GetFirstPartsFromFields(walkInfo.Fields); var properties = GetProperties(walkInfo, fieldFirstParts); if (!walkInfo.Fields.Contains("*")) { walkInfo.Fields = walkInfo.Fields.Except(fieldFirstParts); } walkInfo.RelatedDataLevel--; foreach (var property in properties) { WalkIntoProperty(visitor, property, walkInfo); } return(visitor.Output(walkInfo)); }