首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c# ExeConfiguration (System.Configuration)中的子元素

c# ExeConfiguration (System.Configuration)中的子元素
EN

Stack Overflow用户
提问于 2019-09-19 19:52:51
回答 1查看 133关注 0票数 0

可以使用ExeConfiguration将子对象添加到xml文件中吗?我被这个代码卡住了,我无法弄明白它。我想,仅仅将一个对象作为ConfigurationElement添加到ConfigurationSection中并不是那么简单。有什么方法可以实现我想要的东西吗?

这是我的配置区

代码语言:javascript
复制
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文件的子元素

代码语言:javascript
复制
    {
        [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文件

代码语言:javascript
复制
<?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事件上保存配置的方式

代码语言:javascript
复制
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方法。

代码语言:javascript
复制
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);
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2019-09-20 20:45:13

我的解决方案似乎不起作用,因为它基本上没有任何意义。为了正确地保存数据,我必须在ConfigurationElement中更改属性的默认setter和getter。

例如。

发自:

代码语言:javascript
复制
[ConfigurationProperty(ConfigKeys.UrlColumnName, IsRequired = true, DefaultValue = "Url")]
public string UrlColumnName { get; set; }

至:

代码语言:javascript
复制
[ConfigurationProperty(ConfigKeys.UrlColumnName, IsRequired = true, DefaultValue = "Url")]
public string UrlColumnName
{
    get => (string) this[ConfigKeys.UrlColumnName]; 
    set => this[ConfigKeys.UrlColumnName] = (string) value;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58010418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档