Невозможно прочитать в моем пользовательском разделе .config

ПРИМЕЧАНИЕ: это очень похоже на этот ТАК вопрос, но мне нужна дополнительная помощь.

я пытаюсь создать следующий раздел в своем файле .config, но получаю исключение при попытке доступа к этому разделу.

.конфигурационный файл

<configSections>
    <section name="foos" type="Ackbar.Mvc.Models.Foo.FooCollection, Ackbar.Mvc" requirePermission="false"/>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler" requirePermission="false" />
</configSections>

<foos>
    <add name="aaa" something="zzz"/>
    <add name="bbb" something="yyy"/>
    <add name="ccc" something="xxx"/>
</foos>

Итак, это означает, что мне нужно создать два класса

классы

public class FooCollection : ConfigurationElementCollection
{
    ... with my custom overrides, etc. ...
}

и

public class FooElement : ConfigurationElement
{
    [ConfigurationProperty("Name", IsRequired = true)]
    public string Name { .. }

    [ConfigurationProperty("Something ", IsRequired = true)]
    public string Something { .. }

    [ConfigurationProperty("IsDefault ", IsRequired = false, DefaultValue = false)]
    public bool IsDefault { .. }
}

Кьюл. Теперь, когда я делаю следующее....

var whatever = ConfigurationManager.GetSection("foos") выдает следующее исключение: -

Произошла ошибка при создании обработчика раздела конфигурации для foos: тип «Ackbar.Mvc.Models.Foos.FooCollection» не наследуется от «System.Configuration.IConfigurationSectionHandler».

Кто-нибудь может мне помочь? Я не хочу оборачивать коллекцию ВНУТРИ родительского раздела.

Ваше здоровье :)


person Pure.Krome    schedule 24.02.2010    source источник


Ответы (2)


Вы должны реализовать IConfigurationSectionHandler. Нет пути вокруг этого.

Однако вы можете позволить вашему FooCollection реализовать и этот интерфейс.

Также может присутствовать свойство атрибута IsDefaultCollection. удобный.

person Mark Seemann    schedule 24.02.2010
comment
Понял :) _finally- у меня ушло много лет. я опубликую код в своем вступительном посте, чтобы помочь другим. Здоровья, приятель! - person Pure.Krome; 25.02.2010
comment
IConfigurationSectionHandler устарел, начиная с .NET 1.1. Вместо этого используйте класс ConfigurationSection. - person RoastBeast; 30.10.2013
comment
@RoastBeast Вы должны дать ответ, пытаясь понять, что ожидает object Create(object parent, object configContext, XmlNode section), это пустая трата времени, когда вы можете просто изменить унаследованный тип. - person MrLore; 27.11.2018

FooCollection не является разделом, поэтому он должен расширять ConfigurationSection.

Тем не менее, вам все равно нужно создать ConfigurationElementCollection в качестве резервной коллекции, вам просто нужно подключить ее по-другому. Я бы назвал вещи немного по-другому с FooSection для самого раздела.

<configSections>
    <section name="foos" type="Ackbar.Mvc.Models.Foo.FooSection, Ackbar.Mvc" requirePermission="false"/>
</configSections>

<foos>
    <add name="aaa" something="zzz"/>
    <add name="bbb" something="yyy"/>
    <add name="ccc" something="xxx"/>
</foos>

И раздел:

public class FooSection : ConfigurationSection
{
    [ConfigurationProperty("", IsDefaultCollection=true)]
    public FooCollection Foos => (FooCollection)this[""];

    // optionally add convenience accessors to the `Foos` collection
}
person Jeff Mercado    schedule 19.12.2018