Exemplo n.º 1
0
        /// <summary>
        /// Adds the specified entity type and any associated entity types recursively to the specified set.
        /// </summary>
        /// <param name="entityType">The entity Type to add.</param>
        /// <param name="entityTypes">The types set to accumulate in.</param>
        /// <param name="metadataProvider">The metadata provider.</param>
        private static void AddEntityType(Type entityType, ICollection <Type> entityTypes, Metadata.MetadataProvider metadataProvider)
        {
            if (entityTypes.Contains(entityType))
            {
                // already added this type
                return;
            }

            entityTypes.Add(entityType);
            RegisterDataControllerTypeDescriptionProvider(entityType, metadataProvider);

            if (metadataProvider.IsEntityType(entityType))
            {
                TypeDescriptor.GetProperties(entityType)
                .Cast <PropertyDescriptor>()
                .Where(pd => pd.HasAttribute <AssociationAttribute>())
                .Where(TypeUtility.IsDataMember)
                .Select(pd => TypeUtility.GetElementType(pd.PropertyType))
                .ForEach(t => AddEntityType(t, entityTypes, metadataProvider));
            }


            // Recursively add any derived entity types specified by [KnownType]
            // attributes
            TypeUtility.GetKnownTypes(entityType, true)
            .Where(entityType.IsAssignableFrom)
            .ForEach(t => AddEntityType(t, entityTypes, metadataProvider));
        }