/// <summary>
        /// Get value.
        /// </summary>
        /// <param name="valueProvider">The <see cref="IPopulaterValueProvider"/>.</param>
        /// <param name="type">The value type.</param>
        /// <param name="prefix">Prefix for string values.</param>
        /// <param name="depth">Depth of value within object hierarchy.</param>
        /// <returns>The value.</returns>
        protected object GetValue(IPopulaterValueProvider valueProvider, Type type, string prefix, int depth)
        {
            object   value    = null;
            TypeInfo typeInfo = type.GetTypeInfo();

            if (_generatorDictionary.ContainsKey(type))
            {
                value = _generatorDictionary[type](valueProvider, prefix);
            }
            else if (typeInfo.IsArray)
            {
                value = GetArray(valueProvider, type.GetElementType(), prefix, depth + 1);
            }
            else if (_iListTypeInfo.IsAssignableFrom(type))
            {
                value = GetList(valueProvider, typeInfo, prefix, depth + 1);
            }
            else if (_iEnumerableTypeInfo.IsAssignableFrom(type))
            {
                value = GetIEnumerable(valueProvider, typeInfo, prefix, depth + 1);
            }
            else if (typeInfo.IsClass)
            {
                value = GetClassInstance(valueProvider, type, depth + 1);
            }
            else if (typeInfo.IsEnum)
            {
                value = valueProvider.GetEnum(type);
            }

            return(value);
        }