我正在尝试编写一个与XML文件保持同步的IXmlSerializable
类。 XML文件具有以下格式:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<logging>
<logLevel>Error</logLevel>
</logging>
...potentially other sections...
</configuration>
我有一个DllConfig
类用于整个XML文件,一个LoggingSection
类用于表示<logging>
及其内容,即<logLevel>
。 DllConfig
拥有此属性:
[XmlElement(ElementName = LOGGING_TAG_NAME,
DataType = "LoggingSection")]
public LoggingSection Logging { get; protected set; }
我想要的是在设置属性时更新(即重写)支持XML文件。设置DllConfig
时,我已Logging
执行此操作。但是,如果设置Logging.LogLevel
,我应该怎么做呢?这是我的意思的一个例子:
var config = new DllConfig("path_to_backing_file.xml");
config.Logging.LogLevel = LogLevel.Information; // not using Logging setter, but a
// setter on LoggingSection, so how
// does path_to_backing_file.xml
// have its contents updated?
我目前的解决方案是拥有一个继承自SyncedLoggingSection
的{{1}}类,并在构造函数中使用LoggingSection
个实例。它声明DllConfig
,在设置时,更新基类中的new LogLevel
,并使用给定的LogLevel
将整个DllConfig
写入支持XML文件。这是一项很好的技术吗?
我认为我不能将DllConfig
自行序列化到支持XML文件,因为不会写入所有内容,只会编写SyncedLoggingSection
节点。然后我最终会得到一个XML文件,其中只包含<logging>
部分及其更新的<logging>
,而不是更新<logLevel>
的整个配置文件。因此,我需要将<logLevel>
的实例传递给DllConfig
。
似乎我想要一个事件处理程序,SyncedLoggingSection
中的事件处理程序会注意到其属性(即DllConfig
)中的特定属性(即LogLevel
)何时被设置。这样的事情有可能吗?
答案 0 :(得分:0)
由于您自己实现了IXmlSerializable,因此可以将DllConfig.Logging设为私有。然后在DllConfig上添加一个公共方法来设置LogLevel,而不是直接设置Logging.LogLevel。这将是您更改LogLevel的唯一方法。在该公共方法的实现中,您可以序列化整个DllConfig以覆盖xml。