如何模拟 .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
中实际重新创建/模拟此功能?
谢天谢地,我们现在有了源代码。看起来它只是通过读取文件系统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);
}
}
}