/// <summary>
        /// Adds a new property.
        /// </summary>
        /// <param name="name">The name.</param>
        /// <param name="type">The type.</param>
        /// <param name="defaultValue">The default value.</param>
        /// <param name="readOnly">if set to <c>true</c> the property is read only.</param>
        /// <param name="sortOrder">The property sort order.</param>
        /// <param name="attributes">The property custom attributes or null.</param>
        /// <returns>
        /// An instance of the DynamicObjectProperty type.
        /// </returns>
        public virtual DynamicObjectProperty AddProperty(string name, Type type, object defaultValue, bool readOnly, int sortOrder, Attribute[] attributes)
        {
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }

            if (type == null)
            {
                throw new ArgumentNullException("type");
            }

            if (_properties.Find(x => x.Name == name) != null)
            {
                throw new ArgumentException("Property '" + name + "' is already defined", "name");
            }

            List <Attribute> newAtts;

            if (attributes != null)
            {
                newAtts = new List <Attribute>(attributes);
            }
            else
            {
                newAtts = new List <Attribute>();
            }

            newAtts.RemoveAll(a => a is ReadOnlyAttribute);
            newAtts.RemoveAll(a => a is DefaultValueAttribute);

            if (readOnly)
            {
                newAtts.Add(new ReadOnlyAttribute(true));
            }
            newAtts.Add(new DefaultValueAttribute(defaultValue));

            DynamicObjectProperty dop = CreateProperty(name, type, newAtts.ToArray());

            dop.SortOrder = sortOrder;
            _properties.Add(dop);
            return(dop);
        }
        /// <summary>
        /// Adds a new property.
        /// </summary>
        /// <param name="name">The name.</param>
        /// <param name="type">The type.</param>
        /// <param name="attributes">The property custom attributes or null.</param>
        /// <returns>An instance of the DynamicObjectProperty type.</returns>
        public virtual DynamicObjectProperty AddProperty(string name, Type type, IEnumerable <Attribute> attributes)
        {
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }

            if (type == null)
            {
                throw new ArgumentNullException("type");
            }

            if (_properties.Find(x => x.Name == name) != null)
            {
                throw new ArgumentException("Property '" + name + "' is already defined", "name");
            }

            DynamicObjectProperty dop = CreateProperty(name, type, attributes);

            _properties.Add(dop);
            return(dop);
        }