代码之家  ›  专栏  ›  技术社区  ›  cchampion

如何在C中实现配置元素?

  •  0
  • cchampion  · 技术社区  · 14 年前

    下面是我粘贴代码时遇到的错误。

    无法创建类zdrcreatortests.zdrcreatortests的实例。错误:System.Configuration.ConfigurationErrorException:无法分析属性“indexedFolder”的默认值。错误为:找不到支持“directoryinfo”类型的属性“indexedfolder”的字符串转换的转换器。

    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后将它们转换为其他对象?或者,是否有一个地方可以让我继续把它们构建成将在内部使用的对象。输入的验证将在哪里进行?

    2 回复  |  直到 12 年前
        1
  •  1
  •   casperOne    14 年前

    我知道这不能直接回答你的问题,但我 强烈地 鼓励你看看 Configuration Section Designer project on CodePlex .

    它将为您提供应用程序中配置部分的设计时体验,从设计器为您生成类代码,以及将它们放入配置文件的模板。

    手工完成所有这些工作是非常、非常乏味的,而且我还没有看到配置部分设计器 把手。

        2
  •  3
  •   Mike Chaliy    12 年前

    您可以添加 TypeConventerAttribute 使用将字符串(来自配置)从/转换为DirectoryInfo的转换器。转换器的类派生自 TypeConverter .

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