private ModelMetadataRegistryItem CreateModelMetadataRegistryItem([NotNull] Type modelType) { Invariant.IsNotNull(modelType, "modelType"); IModelMetadataConfiguration configuration; if (!configurations.TryGetValue(modelType, out configuration)) { configuration = configurations .Where(kvp => kvp.Key.IsAssignableFrom(modelType)) .OrderBy(x => x.Key, new TypeInheritanceComparer()) .Select(x => x.Value) .FirstOrDefault(); } var canAcceptConventions = ConventionAcceptor.CanAcceptConventions(new AcceptorContext(modelType, configuration != null)); if (configuration == null && !canAcceptConventions) { return(null); } var item = new ModelMetadataRegistryItem(); if (canAcceptConventions) { var properties = modelType.GetProperties(); foreach (var convention in conventions) { foreach (var pi in properties) { if (convention.IsApplicable(pi)) { var propertyMetadata = item.GetPropertyMetadataOrCreateNew(pi.Name); convention.Apply(pi, propertyMetadata); } } } } if (configuration != null) { foreach (var pair in configuration.Configurations) { var name = pair.Key; var configurator = pair.Value; var propertyMetadata = item.GetPropertyMetadataOrCreateNew(name); configurator.Configure(propertyMetadata); } } return(item); }