将自定义部分保存到配置文件

时间:2013-09-04 07:03:05

标签: c# web-config

我有一个小问题,基本上我想在我的配置文件中实现以下结果:

<customSection>
<settings>
<setting key="" value="" />
<setting key="" value=""/>
...
</settings>
</customSection>

我已经创建了以下代码,但是在第一次运行时我无法创建具有我传递的值的结构!

以下是初始化此配置代码并使用值构建默认结构的代码:

ConfigurationSectionManager config = new ConfigurationSectionManager("CustomSection");
config.CreateDefaultConfigurationSection("CustomSection");
Log("Get value  = " + (config.GetSection() as ConfigurationSectionManager).Settings[1].Value); //instead of [1] a key should be set ...

现在是配置部分经理的代码:

public class ConfigurationSectionManager: ConfigurationSection
{
    private const string defaultSectionName = "Default";

    private string sectionName;
    public string SectionName 
    {
        get 
        {
            if (string.IsNullOrEmpty(sectionName))
            {
                return defaultSectionName;
            }
            return sectionName;
        }
        set
        {
            sectionName = value;
        }
    }

    public SancoConfigurationSectionManager(string sectionName)
    {
        SectionName = sectionName;
    }

    public void CreateDefaultConfigurationSection(string sectionName)
    {
        ConfigurationSectionManager defaultSection = new ConfigurationSectionManager(sectionName);
        SettingsConfigurationCollection settingsCollection = new SettingsConfigurationCollection();
        settingsCollection[0] = new SettingConfigurationElement() { Key="Element", Value="Element value" };
        settingsCollection[1] = new SettingConfigurationElement() { Key = "NewElement", Value = "NeValueElement" };
        settingsCollection[2] = new SettingConfigurationElement() { Key = "NewElement2", Value = "NeValueElement2" };
        defaultSection.Settings = settingsCollection;
        CreateConfigurationSection(sectionName, defaultSection);
    }

    public void CreateConfigurationSection(string sectionName, ConfigurationSection section)
    {
        var config = ConfigurationManager.OpenExeConfiguration(null);
        if (config.Sections[SectionName] == null)
        {
            config.Sections.Add(SectionName, section);
            section.SectionInformation.ForceSave = true;
            config.Save(ConfigurationSaveMode.Full);
        }
    }

    public object GetSection()
    {
        return ConfigurationManager.GetSection(SectionName);
    }

    public override bool IsReadOnly()
    {
        return false;
    }

    public void Save()
    {
        Configuration config = ConfigurationManager.OpenExeConfiguration(null);
        ConfigurationSectionManager instance = (ConfigurationSectionManager)config.Sections[SectionName];
        instance.Settings = this.Settings;
        config.Save(ConfigurationSaveMode.Full);
    }

    [ConfigurationProperty("Settings", IsRequired = false)]
    public SettingsConfigurationCollection Settings 
    { 
        get { return this["Settings"] as SettingsConfigurationCollection; }
        set { this["Settings"] = value; }
    }

}

现在设置集合的代码

public class SettingsConfigurationCollection : ConfigurationElementCollection
{
    public SettingConfigurationElement this[int index] 
    { 
        get 
        { 
            return BaseGet(index) as SettingConfigurationElement; 
        } 
        set 
        { 
            if (Count > index && BaseGet(index) != null) 
            { 
                BaseRemoveAt(index); 
            } 
            BaseAdd(index, value); 
        } 
    }     

    protected override ConfigurationElement CreateNewElement() 
    { 
        return new SettingConfigurationElement(); 
    }      

    protected override object GetElementKey(ConfigurationElement element) 
    { 
        return ((SettingConfigurationElement)element).Key; 
    }
}

设置元素的代码

public class SettingConfigurationElement : ConfigurationElement
{
    [ConfigurationProperty("key", IsRequired = true)]
    public string Key 
    { 
        get { return this["key"] as string; }
        set { this["key"] = value; }
    }

    [ConfigurationProperty("value", IsRequired = true)]
    public string Value 
    { 
        get { return this["value"] as string; }
        set { this["value"] = value; }
    }

    public override bool IsReadOnly()
    {
        return false;
    }

}

当我尝试做所有这些时,我得到一个错误:

Unable to load type 'MyApp.Utilities.ConfigurationSectionManager, MyApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cd112ea1ee9f48f2' because it is not public.    at System.Configuration.TypeUtil.GetConstructorWithReflectionPermission(Type type, Type baseType, Boolean throwOnError)
   at System.Configuration.MgmtConfigurationRecord.AddConfigurationSection(String group, String name, ConfigurationSection configSection)
   at System.Configuration.ConfigurationSectionCollection.Add(String name, ConfigurationSection section)

所以基本上我不能创建设置等......

任何人都知道如何使所有这些工作?

1 个答案:

答案 0 :(得分:3)

您的ConfigurationSectionManager缺少默认构造函数。添加并执行。