可以使用ExeConfiguration将子对象添加到xml文件中吗?我被这个代码卡住了,我无法弄明白它。我想,仅仅将一个对象作为ConfigurationElement添加到ConfigurationSection中并不是那么简单。有什么方法可以实现我想要的东西吗?
这是我的配置区
public class DataEnhancementToolConfigurationSection : ConfigurationSection
{
[ConfigurationProperty(ConfigKeys.GoogleApiKeys)]
public GoogleApiKeysConfigurationElementCollection GoogleApiKeys
{
get => (GoogleApiKeysConfigurationElementCollection)this[ConfigKeys.GoogleApiKeys];
set => this[ConfigKeys.GoogleApiKeys] = value;
}
[ConfigurationProperty(ConfigKeys.NameNormalizationAndGeocodingOptions)]
public NameNormalizationOptionsConfigurationElement NameNormalizationAndGeocodingOptions
{
get => (NameNormalizationOptionsConfigurationElement)this[ConfigKeys.NameNormalizationAndGeocodingOptions];
set => this[ConfigKeys.NameNormalizationAndGeocodingOptions] = value;
}
}这是我希望写入xml文件的子元素
{
[DisplayName("Place id")]
[Category("Print")]
[ConfigurationProperty(ConfigKeys.PrintPlaceId)]
public bool PrintPlaceId { get; set; } = true;
[DisplayName("Place id")]
[Category("Column name")]
[ConfigurationProperty(ConfigKeys.PlaceIdColumnName)]
public string PlaceIdColumnName { get; set; } = "PlaceId";
[DisplayName("Company name")]
[Category("Print")]
[DefaultValue(true)]
[ConfigurationProperty(ConfigKeys.PrintCompanyName)]
public bool PrintCompanyName { get; set; } = true;
[DisplayName("Company name")]
[Category("Column name")]
[ConfigurationProperty(ConfigKeys.CompanyNameColumnName)]
public string CompanyNameColumnName { get; set; } = "CompanyName";
...
}这就是我到目前为止得到的xml文件
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="data-enhancement-tool-config" type="DataEnhancementTool.Configuration.DataEnhancementToolConfigurationSection, DataEnhancementTool, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" allowExeDefinition="MachineToLocalUser" />
</configSections>
<data-enhancement-tool-config>
<google-api-keys>
<add google-key=":)" />
</google-api-keys>
</data-enhancement-tool-config>
</configuration>这就是我在WinForms FormClosed事件上保存配置的方式
private void NameNormalizationAndGeocodingForm_FormClosed(object sender, FormClosedEventArgs e)
{
var config =
ConfigurationHelper
.GetSectionFromRoamingConfiguration<DataEnhancementToolConfigurationSection>(
ConfigKeys.DataEnhancementSectionName);
config.section.NameNormalizationAndGeocodingOptions.CityColumnName
= _nameNormalizationOptionsConfigurationElement.CityColumnName;
// ... modify properties
config.configFile.Save(ConfigurationSaveMode.Modified);
}这是我用来打开Exe配置的helper方法。
public static class ConfigurationHelper
{
public static (Configuration configFile, T section) GetSectionFromRoamingConfiguration<T>(string sectionKey)
where T : ConfigurationSection, new()
{
var configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming);
var section = (T)configuration.GetSection(sectionKey) ?? new T();
section.SectionInformation.AllowExeDefinition = ConfigurationAllowExeDefinition.MachineToLocalUser;
return (configuration, section);
}
}发布于 2019-09-20 20:45:13
我的解决方案似乎不起作用,因为它基本上没有任何意义。为了正确地保存数据,我必须在ConfigurationElement中更改属性的默认setter和getter。
例如。
发自:
[ConfigurationProperty(ConfigKeys.UrlColumnName, IsRequired = true, DefaultValue = "Url")]
public string UrlColumnName { get; set; }至:
[ConfigurationProperty(ConfigKeys.UrlColumnName, IsRequired = true, DefaultValue = "Url")]
public string UrlColumnName
{
get => (string) this[ConfigKeys.UrlColumnName];
set => this[ConfigKeys.UrlColumnName] = (string) value;
}https://stackoverflow.com/questions/58010418
复制相似问题