Custom SettingsProvider и получение значения по умолчанию - PullRequest
2 голосов
/ 17 февраля 2011

Я реализовал свой собственный класс, который наследуется от класса SettingsProvider. Если полученное мной значение не было задано пользователем, то есть это первый раз, когда программа запускается, я пытаюсь получить значение по умолчанию. Проблема, которую я вижу, заключается в том, что когда значение по умолчанию извлекается из свойства настройки, оно возвращается в виде строки. Я попытался добавить некоторый код, который преобразует элемент, но у меня возникают проблемы при преобразовании System.Drawing.Colors, и я получаю сообщение об ошибке «Неверное приведение из« System.String »к« System.Drawing.Color ».".

Вот пример кода, который я использую для получения значения по умолчанию:

 private object GetDefaultValue(SettingsProperty setting)
  {
         if (setting.PropertyType.IsEnum)
             return Enum.Parse(setting.PropertyType, setting.DefaultValue.ToString());

        // Return the default value if it is set
        if (setting.DefaultValue != null)
           return Convert.ChangeType(setting.DefaultValue, setting.PropertyType);
        else // If there is no default value return the default object
           return Activator.CreateInstance(setting.PropertyType);
   }

Как правильно преобразовать значение по умолчанию в правильный тип?

1 Ответ

1 голос
/ 17 февраля 2011

Хорошо.Так что я нашел ответ.Вместо использования Convert.ChangeType вам нужно создать экземпляр TypeConverter с параметрами settings.PropertyType.Этот код работает:

private object GetDefaultValue(SettingsProperty setting)
  {
         if (setting.PropertyType.IsEnum)
             return Enum.Parse(setting.PropertyType, setting.DefaultValue.ToString());

        // Return the default value if it is set
        // Return the default value if it is set
         if (setting.DefaultValue != null)
         {
             System.ComponentModel.TypeConverter tc = System.ComponentModel.TypeDescriptor.GetConverter(setting.PropertyType);
             return tc.ConvertFromString(setting.DefaultValue.ToString());
         }
         else // If there is no default value return the default object
         {
             return Activator.CreateInstance(setting.PropertyType);
         }
   }
...