private static void RewriteAllLinks(object model, LinkReWriter rewriter) { if (model == null) { return; } var allProperties = model.GetType().GetTypeInfo().GetAllProperties().Where(p => p.CanRead).ToArray(); var linkProperties = allProperties.Where(p => p.CanWrite && p.PropertyType == typeof(Link)); foreach (var linkProperty in linkProperties) { var rewritten = rewriter.Rewrite(linkProperty.GetValue(model) as Link); if (rewritten == null) { continue; } linkProperty.SetValue(model, rewritten); //sepecial handling of the hidden self property //unwrap into the roop object if (linkProperty.Name == nameof(Resource.Self)) { allProperties.SingleOrDefault(p => p.Name == nameof(Resource.Href)) ?.SetValue(model, rewritten.Href); allProperties.SingleOrDefault(p => p.Name == nameof(Resource.Method)) ?.SetValue(model, rewritten.Method); allProperties.SingleOrDefault(p => p.Name == nameof(Resource.Relations)) ?.SetValue(model, rewritten.Relations); } } var arrayProperties = allProperties.Where(p => p.PropertyType.IsArray); RewriteLinksInArrays(arrayProperties, model, rewriter); var objectProperties = allProperties.Except(linkProperties) .Except(arrayProperties); RewriteLinksInNestedObjects(objectProperties, model, rewriter); }