如何模拟 .config 文件的 appSettings 部分的文件属性

本文关键字:appSettings 文件属性 文件 config 何模拟 模拟 | 更新日期: 2023-09-27 18:36:50

>Microsoft 提供了有关如何使用 file 属性使.config文件的appSettings部分引用另一个文件的说明: 例如:

<appSettings file="c:'commonSettings.config">
    <add key="myAppSpecificSetting" value="Setting1" />
</appSettings>

但是,这是专门为appSettings实现的,而不是一些通用的.config文件功能。

现在,我已经实现了自己的ConfigurationSection,并希望能够像使用appSettings一样指定file=。除了简单地创建属性以匹配属性并检索文件名之外,如何在自定义configSection中实际重新创建/模拟此功能?

如何模拟 .config 文件的 appSettings 部分的文件属性

谢天谢地,我们现在有了源代码。看起来它只是通过读取文件系统AppSettingsSection实现的东西,没有什么特别的可以在您自己的配置部分中重用。

protected internal override void DeserializeElement(XmlReader reader, bool serializeCollectionKey) 
{
    string ElementName = reader.Name;
    base.DeserializeElement(reader, serializeCollectionKey);
    if ((File != null) && (File.Length > 0)) {
        string sourceFileFullPath;
        string configFileDirectory;
        string configFile;
        // Determine file location
        configFile = ElementInformation.Source;
        if (String.IsNullOrEmpty(configFile)) {
            sourceFileFullPath = File;
        }
        else {
            configFileDirectory = System.IO.Path.GetDirectoryName(configFile);
            sourceFileFullPath = System.IO.Path.Combine(configFileDirectory, File);
        }
        if (System.IO.File.Exists(sourceFileFullPath)) {
            int lineOffset = 0;
            string rawXml = null;
            using (Stream sourceFileStream = new FileStream(sourceFileFullPath, FileMode.Open, FileAccess.Read, FileShare.Read)) {
                using (XmlUtil xmlUtil = new XmlUtil(sourceFileStream, sourceFileFullPath, true)) {
                    if (xmlUtil.Reader.Name != ElementName) {
                        throw new ConfigurationErrorsException(
                                SR.GetString(SR.Config_name_value_file_section_file_invalid_root, ElementName),
                                xmlUtil);
                    }
                    lineOffset = xmlUtil.Reader.LineNumber;
                    rawXml = xmlUtil.CopySection();
                    // Detect if there is any XML left over after the section
                    while (!xmlUtil.Reader.EOF) {
                        XmlNodeType t = xmlUtil.Reader.NodeType;
                        if (t != XmlNodeType.Comment) {
                            throw new ConfigurationErrorsException(SR.GetString(SR.Config_source_file_format), xmlUtil);
                        }
                        xmlUtil.Reader.Read();
                    }
                }
            }
            ConfigXmlReader internalReader = new ConfigXmlReader(rawXml, sourceFileFullPath, lineOffset);
            internalReader.Read();
            if (internalReader.MoveToNextAttribute()) {
                throw new ConfigurationErrorsException(SR.GetString(SR.Config_base_unrecognized_attribute, internalReader.Name), (XmlReader)internalReader);
            }
            internalReader.MoveToElement();
            base.DeserializeElement(internalReader, serializeCollectionKey);
        }
    }
}