2010-02-15 2 views
0

Вот ошибка, которую я получаю с кодом, вставленным ниже.Как реализовать ConfigurationElement в C#?

Невозможно создать экземпляр класса ZDRCreatorTests.ZDRCreatorTests. Ошибка: System.Configuration.ConfigurationErrorsException: значение по умолчанию для параметра indexedFolder не может быть проанализировано. Ошибка: Не удается найти конвертер, который поддерживает преобразование в/из строки для свойства «indexedFolder» типа «DirectoryInfo» ..

namespace ZDRCreator 
{ 
    public class ZDRCreatorElement : ConfigurationElement 
    { 
     // Create the element. 
     public ZDRCreatorElement() 
     { } 

     // Get or set the IndexedFolder 
     [ConfigurationProperty("indexedFolder", DefaultValue = "", IsRequired = true)] 
     public DirectoryInfo IndexedFolder { 
      get { return (DirectoryInfo)this["indexedFolder"]; } 
      set { this["indexedFolder"] = value; } 
     } 

     // Get or set the OutputFolder 
     [ConfigurationProperty("outputFolder", DefaultValue = "", IsRequired = true)] 
     public DirectoryInfo OutputFolder { 
      get { return (DirectoryInfo)this["outputFolder"]; } 
      set { this["outputFolder"] = value; } 
     } 

     // Get or set the ZDRFile 
     [ConfigurationProperty("ZDRFile", DefaultValue = "", IsRequired = true)] 
     public FileInfo ZDRFile { 
      get { return (FileInfo)this["ZDRFile"]; } 
      set { this["ZDRFile"] = value; } 
     } 

     // Get or set the overwriteOutput flag 
     [ConfigurationProperty("overwriteOutput", DefaultValue = "false", IsRequired = true)] 
     public bool OverwriteOutput { 
      get { return (bool)this["overwriteOutput"]; } 
      set { this["overwriteOutput"] = value; } 
     } 

     // Get or set the OutputFile 
     [ConfigurationProperty("outputFile", DefaultValue = "", IsRequired = true)] 
     public String OutputFile { 
      get { return (String)this["outputFile"]; } 
      set { this["outputFile"] = value; } 
     } 
     // Get or set the OutputFile 
     [ConfigurationProperty("pathMask", DefaultValue = "", IsRequired = true)] 
     public String PathMask { 
      get { return (String)this["pathMask"]; } 
      set { this["pathMask"] = value; } 
     } 
    } 
} 

Я понимаю, что ошибка, потому что я пытаюсь поставить строку в объекте DirectoryInfo. Мой вопрос заключается в следующем: предположим ли я хранить только строки или примитивные типы данных, прочитанные из xml, а затем преобразовать их в другие объекты после чтения xml? ИЛИ, есть место, где я могу идти вперед и строить их в объект, который будет использоваться внутри. Где произойдет валидация ввода?

ответ

1

Я знаю, что это прямо не отвечает на ваш вопрос, но я сильно поощряю вас взглянуть на Configuration Section Designer project on CodePlex.

Это даст вам время разработки для разделов конфигурации в вашем приложении, генерируя код класса для вас от дизайнера, а также шаблоны для размещения их в файле конфигурации.

Чтобы сделать все это самостоятельно, вручную, очень, очень утомительно, и я еще не видел ситуации, когда конструктор секции конфигурации не делает ручкой.

+0

Все, что вы говорите, абсолютно верно. CSD - замечательный инструмент, но в наши дни это почти полная версия Visual Studio. Так грустно видеть, как он томится. – QueueHammer

3

Вы можете добавить TypeConventerAttribute с конвертером, который преобразует строку (которая будет поступать из конфигурации) из/в каталог. Конвертер - это класс, полученный от TypeConverter.

[ConfigurationProperty("ZDRFile", DefaultValue = "", IsRequired = true)] 
[TypeConverter(typeof(YourCustomFileInfoTypeConverter))] 
public FileInfo ZDRFile { 
    get { return (FileInfo)this["ZDRFile"]; } 
    set { this["ZDRFile"] = value; } 
} 
+1

Я предпочел ваш ответ. И для тех, кто наткнется на это позже, вот статья MSDN, в которой вы можете создать настраиваемый конвертер типов: http://msdn.microsoft.com/en-us/library/ayybcxe5.aspx –

Смежные вопросы