コード例 #1
0
        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 });
                        }
                    }
                }
            }
        }