public ISettingsProviderClass GetSettingsFromProvider(Type settingsProviderType, ISolutionProjectModel solutionProject = null)
        {
            var res = ReflectionHelper.CreateInstance(settingsProviderType) as ISettingsProviderClass;

            foreach (PropertyInfo propertyInfo in res.GetSettableProperties())
            {
                var         settingsPropertyAttribute = CoreExtensions.GetAttributes <SettingsPropertyAttribute>(propertyInfo, false).First();
                SettingsKey settingsKey = SettingsExtensions.GetSettingsKey(propertyInfo, res);

                object defaultValue = null;
                DefaultValueAttribute defaultValueAttribute = CoreExtensions.GetAttributes <DefaultValueAttribute>(propertyInfo, false).FirstOrDefault();
                if (defaultValueAttribute != null)
                {
                    defaultValue = defaultValueAttribute.Value;
                }

                var loadedValue = Get(settingsKey, propertyInfo.PropertyType, defaultValue ?? propertyInfo.GetValue(res));
                if (solutionProject != null && settingsPropertyAttribute.Availability == SettingsAvailability.ProjectSpecific || settingsPropertyAttribute.Availability == SettingsAvailability.GlobalWithProjectSpecificOverride)
                {
                    settingsKey = SettingsExtensions.GetSettingsKey(propertyInfo, res, solutionProject);
                    loadedValue = Get(settingsKey, propertyInfo.PropertyType, loadedValue);
                }

                propertyInfo.SetValue(res, loadedValue);
            }
            return(res);
        }
        public object GenerateSettingsObjectForInspector(ISolutionProjectModel solutionProject = null, params object[] objectsToMerge)
        {
            var propertiesForInspector = new CustomClass("Properties", objectsToMerge);

            var settingsProviderClasses = CheckoutAndBuild2Package.GetExportedValues <ISettingsProviderClass>();

            foreach (ISettingsProviderClass settingsProviderClass in settingsProviderClasses)
            {
                var res = GetSettingsFromProvider(settingsProviderClass.GetType(), solutionProject);
                IEnumerable <PropertyInfo> settableProperties;
                if (solutionProject != null)
                {
                    settableProperties = res.GetSettableProperties(SettingsAvailability.ProjectSpecific, SettingsAvailability.GlobalWithProjectSpecificOverride);
                }
                else
                {
                    settableProperties = res.GetSettableProperties(SettingsAvailability.Global, SettingsAvailability.GlobalWithProjectSpecificOverride);
                }

                foreach (var propertyInfo in settableProperties)
                {
                    SettingsKey settingsKey = SettingsExtensions.GetSettingsKey(propertyInfo, res, solutionProject);
                    var         value       = Get(settingsKey, propertyInfo.PropertyType, propertyInfo.GetValue(res));
                    propertiesForInspector.AddProperty(propertyInfo, value, o => Set(o.GetType(), settingsKey, o));
                }
            }

            return(propertiesForInspector);
        }