public void Populate(Type modelType, object model, LinkArgumentStyle linkArgumentStyle) { if (IsListOrArray(modelType)) { PopulateList(modelType, model, linkArgumentStyle); } else { if (!modelType.IsSealed && model != null) { modelType.GetProperties().ForEach(propertyInfo => Populate(propertyInfo.PropertyType, propertyInfo.GetValue(model, null), linkArgumentStyle)); } var linkAttributes = modelType.GetCustomAttributes(typeof(LinksToAttribute), true).Cast <LinksToAttribute>(); foreach (var linkAttribute in linkAttributes) { IGenerateLinksFor linkGenerator = null; if (linkAttribute.ResponseType != null) { var linkGeneratorType = typeof(IGenerateLinksFor <,>).MakeGenericType(linkAttribute.ResponseType, modelType); linkGenerator = _linkGenerators.SingleOrDefault(linkGeneratorType.IsInstanceOfType); } if (linkGenerator != null) { var route = _linkGenerator.FindHttpRoute(linkAttribute.ResponseType); linkGenerator.GetType().GetMethod("Generate").Invoke(linkGenerator, new object[] { linkAttribute, model, route, linkArgumentStyle }); } else { MethodInfo generic = _linkGenerator.GetType().GetMethod("Generate").MakeGenericMethod(modelType); if (linkAttribute.LinkType == LinkTo.Resource) { generic.Invoke(_linkGenerator, new object[] { linkAttribute.ResponseType, linkAttribute.Name, model, linkArgumentStyle }); } else { generic.Invoke(_linkGenerator, new object[] { modelType, linkAttribute.LinkType.ToString(), model, linkArgumentStyle }); } } } } }