Пример #1
0
        public object this[
            string propertyName]
        {
            get
            {
                foreach (var property in _extraProperties.Keys)
                {
                    if (property
                        .ToLower() == propertyName
                        .ToLower())
                    {
                        return(_extraProperties[property]);
                    }
                }

                foreach (var property in GetType()
                         .GetProperties())
                {
                    if (property.Name
                        .ToLower() == propertyName
                        .ToLower())
                    {
                        return(GDbReflectionHelper
                               .GetValueOfProperty(
                                   this,
                                   property.Name));
                    }
                }

                throw new InvalidOperationException(
                          "This object has no '" + propertyName + "' property (case-insensitive).");
            }

            set
            {
                foreach (var property in GetType()
                         .GetProperties())
                {
                    if (property.Name
                        .ToLower() == propertyName
                        .ToLower())
                    {
                        GDbReflectionHelper
                        .SetValueOfProperty(
                            this,
                            property.Name,
                            value);

                        return;
                    }
                }

                _extraProperties[propertyName] = value;
            }
        }
        public IGDbModelDescriptor ToMany(
            Type relatedType,
            string relatedProperty = null)
        {
            var typeOfProperty
                = GDbReflectionHelper
                  .GetTypeOfProperty(
                      GDbModelDescriptor.TargetType,
                      _property);

            if (typeOfProperty
                .IsCollectionType())
            {
                if (typeOfProperty
                    .GetCollectionType() == relatedType)
                {
                    if (relatedProperty != null)
                    {
                        if (relatedType
                            .HasProperty(
                                relatedProperty))
                        {
                            var typeOfRelatedProperty
                                = GDbReflectionHelper
                                  .GetTypeOfProperty(
                                      relatedType,
                                      relatedProperty);

                            if (typeOfProperty
                                .GetCollectionType() == GDbModelDescriptor.TargetType || !typeOfRelatedProperty
                                .IsCollectionType())
                            {
                                if (typeOfRelatedProperty != GDbModelDescriptor.TargetType)
                                {
                                    if (typeOfRelatedProperty
                                        .GetCollectionType() != GDbModelDescriptor.TargetType)
                                    {
                                        throw new ArgumentException(
                                                  "Incorrect related property: '" + relatedProperty + "' is not a '" + GDbModelDescriptor.TargetType.Name + "' type property.",
                                                  nameof(relatedProperty));
                                    }
                                }
                            }
                            else
                            {
                                throw new ArgumentException(
                                          "Incorrect related property: '" + relatedProperty + "' is a collection. Many-to-many is not supported.",
                                          nameof(relatedProperty));
                            }
                        }
                        else
                        {
                            throw new ArgumentException(
                                      "Incorrect related property: '" + relatedType.Name + "' has no property with name '" + relatedProperty + "'.",
                                      nameof(relatedProperty));
                        }
                    }
                }
                else
                {
                    throw new ArgumentException(
                              "Incorrect related type: '" + relatedType.Name + "' for property '" + _property + "'.",
                              nameof(relatedType));
                }
            }
            else
            {
                throw new InvalidOperationException(
                          "Property '" + _property + "' is not a collection, so can not be used with 'ToMany()'.");
            }

            GDbModelDescriptor.AddModelDescriptorEntry(
                GDbModelDescriptorEntryTypes.EDGE,
                _name,
                _property,
                relatedProperty);

            return(_gDbModelDescriptor);
        }