public void Should_be_for_closed_entity_type()
        {
            // given
            var provider = new ClosedGenericEntityMappingProvider(CreateOpenGenericProvider("MappedProperty1"), typeof(int));

            // when
            var entityType = provider.EntityType;

            // then
            entityType.Should().Be <IGenericParent <int> >();
        }
Exemplo n.º 2
0
        private IEntityMapping CreateMappingFromGenericDefinition(Type genericDefinition, Type entityType)
        {
            var openGenericProvider = _openGenericProviders[genericDefinition];
            var provider            = new ClosedGenericEntityMappingProvider(openGenericProvider, entityType.GenericTypeArguments);

            foreach (var visitor in _providerVisitors)
            {
                provider.Accept(visitor);
            }

            return(_mappingBuilder.BuildMapping(provider));
        }
        public void Should_return_mappings_for_closed_properties(string propertyName, Type expectedType)
        {
            // given
            var provider = new ClosedGenericEntityMappingProvider(CreateOpenGenericProvider(propertyName), typeof(int));

            // when
            var propertyMapping = provider.Properties.Single();

            // then
            propertyMapping.Should().NotBeNull();
            propertyMapping.PropertyInfo.PropertyType.Should().Be(expectedType);
        }
        private void DiscoverProperties()
        {
            var inheritedProperties = new HashSet <IPropertyMappingProvider>();
            var properties          = new Dictionary <string, IPropertyMappingProvider>();

            foreach (var property in _mainProvider.Properties)
            {
                properties[property.PropertyInfo.Name] = property;
            }

            var parents = new Queue <Type>(_mainProvider.EntityType.GetImmediateParents());

            while (parents.Any())
            {
                var iface = parents.Dequeue();
                foreach (var immediateParent in iface.GetImmediateParents())
                {
                    parents.Enqueue(immediateParent);
                    if (immediateParent.GetTypeInfo().IsGenericTypeDefinition&& _parentProviders.ContainsKey(immediateParent))
                    {
                        var parentMapping = _parentProviders[immediateParent];
                        _parentProviders[iface] = new ClosedGenericEntityMappingProvider(
                            parentMapping, iface.GetTypeInfo().GetGenericArguments());
                    }
                }

                if (_parentProviders.ContainsKey(iface))
                {
                    var provider = _parentProviders[iface];
                    foreach (var propertyMapping in provider.Properties)
                    {
                        inheritedProperties.Add(propertyMapping);
                    }
                }
            }

            _propertyProviders.AddRange(properties.Values);

            foreach (var inheritedProperty in inheritedProperties.GroupBy(p => p.PropertyInfo.Name))
            {
                if (properties.ContainsKey(inheritedProperty.Key))
                {
                    _hiddenProperties.AddRange(inheritedProperty.Where(p => p.PropertyInfo.DeclaringType.GetTypeInfo().IsGenericTypeDefinition == false));
                }
                else
                {
                    var propertyMappingProvider = (from property in inheritedProperty
                                                   group property by property.PropertyInfo.DeclaringType.GetTypeInfo().IsGenericTypeDefinition into g
                                                   select g).ToDictionary(g => g.Key, g => g);

                    if (propertyMappingProvider[false].Any())
                    {
                        _propertyProviders.AddRange(propertyMappingProvider[false]);
                    }
                    else
                    {
                        _propertyProviders.AddRange(propertyMappingProvider[true]);
                    }
                }
            }
        }