/// <summary>
        /// Enumerates the properties in the specified type and stores the attributes associated with each property
        /// in a <see cref="SchemaAttributes"/> object.
        /// </summary>
        /// <param name="type">The type to reflect on.</param>
        /// <returns>An enumeration of attributes associated with each property in the <paramref name="type"/>.</returns>
        public IEnumerable<SchemaAttributes> GetSchemaAttributes(Type type)
        {
            lock (this.schemaAttributes)
            {
                IEnumerable<SchemaAttributes> result;

                if (!this.schemaAttributes.TryGetValue(type, out result))
                {
                    List<SchemaAttributes> list;

                    list = new List<SchemaAttributes>();
                    result = list;
                    this.schemaAttributes[type] = result;

                    foreach (PropertyInfo info in type.GetProperties(BindingFlags.Instance | BindingFlags.Public))
                    {
                        object[] attributes;
                        ConverterAttribute converter;
                        DefaultValueAttribute defaultValue;
                        HasValueIndicatorAttribute hasValueIndicator;
                        SchemaAttributes listEntry;
                        SchemaEntityAttribute schema;
                        List<InheritValueAttribute> inheritanceList;
                        List<string> dependencyList;

                        converter = null;
                        defaultValue = null;
                        dependencyList = new List<string>();
                        hasValueIndicator = null;
                        inheritanceList = new List<InheritValueAttribute>();
                        schema = null;

                        attributes = info.GetCustomAttributes(true);
                        foreach (object attribute in attributes)
                        {
                            Type attributeType;

                            attributeType = attribute.GetType();

                            if (attributeType == typeof(ConverterAttribute))
                            {
                                converter = (ConverterAttribute)attribute;
                            }
                            else if (attributeType == typeof(DefaultValueAttribute))
                            {
                                defaultValue = (DefaultValueAttribute)attribute;
                            }
                            else if (attributeType == typeof(HasValueIndicatorAttribute))
                            {
                                hasValueIndicator = (HasValueIndicatorAttribute)attribute;
                            }
                            else if (attributeType == typeof(SchemaEntityAttribute))
                            {
                                schema = (SchemaEntityAttribute)attribute;
                            }
                            else if (attributeType == typeof(InheritValueAttribute))
                            {
                                inheritanceList.Add((InheritValueAttribute)attribute);
                            }
                            else if (attributeType == typeof(ExplicitOutputDependencyAttribute))
                            {
                                dependencyList.Add(((ExplicitOutputDependencyAttribute)attribute).Property);
                            }
                        }

                        listEntry = new SchemaAttributes(
                                                         info.Name,
                                                         converter,
                                                         defaultValue,
                                                         hasValueIndicator,
                                                         schema,
                                                         inheritanceList,
                                                         dependencyList);
                        list.Add(listEntry);
                    }
                }

                return result;
            }
        }
        /// <summary>
        /// Enumerates the properties in the specified type and stores the attributes associated with each property
        /// in a <see cref="SchemaAttributes"/> object.
        /// </summary>
        /// <param name="type">The type to reflect on.</param>
        /// <returns>An enumeration of attributes associated with each property in the <paramref name="type"/>.</returns>
        public IEnumerable <SchemaAttributes> GetSchemaAttributes(Type type)
        {
            lock (this.schemaAttributes)
            {
                IEnumerable <SchemaAttributes> result;

                if (!this.schemaAttributes.TryGetValue(type, out result))
                {
                    List <SchemaAttributes> list;

                    list   = new List <SchemaAttributes>();
                    result = list;
                    this.schemaAttributes[type] = result;

                    foreach (PropertyInfo info in type.GetProperties(BindingFlags.Instance | BindingFlags.Public))
                    {
                        object[]                                 attributes;
                        ConverterAttribute                       converter;
                        DefaultValueAttribute                    defaultValue;
                        HasValueIndicatorAttribute               hasValueIndicator;
                        SchemaAttributes                         listEntry;
                        SchemaEntityAttribute                    schema;
                        List <InheritValueAttribute>             inheritanceList;
                        List <ExplicitOutputDependencyAttribute> dependencyList;

                        converter         = null;
                        defaultValue      = null;
                        dependencyList    = new List <ExplicitOutputDependencyAttribute>();
                        hasValueIndicator = null;
                        inheritanceList   = new List <InheritValueAttribute>();
                        schema            = null;

                        attributes = info.GetCustomAttributes(true);
                        foreach (object attribute in attributes)
                        {
                            Type attributeType;

                            attributeType = attribute.GetType();

                            if (attributeType == typeof(ConverterAttribute))
                            {
                                converter = (ConverterAttribute)attribute;
                            }
                            else if (attributeType == typeof(DefaultValueAttribute))
                            {
                                defaultValue = (DefaultValueAttribute)attribute;
                            }
                            else if (attributeType == typeof(HasValueIndicatorAttribute))
                            {
                                hasValueIndicator = (HasValueIndicatorAttribute)attribute;
                            }
                            else if (attributeType == typeof(SchemaEntityAttribute))
                            {
                                schema = (SchemaEntityAttribute)attribute;
                            }
                            else if (attributeType == typeof(InheritValueAttribute))
                            {
                                inheritanceList.Add((InheritValueAttribute)attribute);
                            }
                            else if (attributeType == typeof(ExplicitOutputDependencyAttribute))
                            {
                                dependencyList.Add((ExplicitOutputDependencyAttribute)attribute);
                            }
                        }

                        listEntry = new SchemaAttributes(
                            info.Name,
                            converter,
                            defaultValue,
                            hasValueIndicator,
                            schema,
                            inheritanceList,
                            dependencyList);
                        list.Add(listEntry);
                    }
                }

                return(result);
            }
        }