Раздел конфигурации с вложенным элементом ConfigurationElementCollections

Надеюсь, я могу представить эту проблему мозговому доверию этого сайта, и кто-то увидит мою ошибку.

Я работаю над проектом, в котором текст электронной почты должен быть "объединен" с информацией, найденной в свойствах различных внутренних классов. Типичный символ, найденный в тексте электронного письма, может выглядеть как "{имя участника}, {мобильный телефон} и т. Д."

Я хотел бы определить символы и классы, в которых они находятся, используя ConfigurationSection в web.config. Вот мой предложенный раздел конфигурации:

<EmailSymbols>
    <SymbolClasses>

        <SymbolClass name="OHMember">
            <Symbol name="Member Name" template="{0} {1}">
                <add index="0" value="SMFirstName" />
                <add index="1" value="SMLastName" />
            </Symbol>
            <Symbol name="Phone" template="{0}">
                <add index="0" value="SMPhone" />
            </Symbol>
        </SymbolClass>

        <SymbolClass name="Form">
            <Symbol name="Contact Name" dataname="ContactName" />
        </SymbolClass>

    </SymbolClasses>
</EmailSymbols>

... и код, с которым я пытаюсь разобрать его:

public class EmailSymbols : ConfigurationSection {

    [ConfigurationProperty("SymbolClasses", IsRequired = true)]
    public SymbolClassCollection SymbolClasses {
        get {
            return this["SymbolClasses"] as SymbolClassCollection;
        }
    }
}

[ConfigurationCollection(typeof(SymbolClass), AddItemName = "SymbolClass")]
public class SymbolClassCollection : ConfigurationElementCollection {

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

    protected override object GetElementKey(ConfigurationElement element) {
        return ((SymbolClass)element).Name;
    }
}

[ConfigurationCollection(typeof(Symbol), AddItemName = "Symbol")]
public class SymbolClass : ConfigurationElementCollection {

    [ConfigurationProperty("name", IsRequired = true, IsKey = true)]
    public String Name {
        get {
            return this["name"] as String;
        }
    }

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

    protected override object GetElementKey(ConfigurationElement element) {
        return ((Symbol)element).Name;
    }
}

[ConfigurationCollection(typeof(TemplateValue), AddItemName = "add")]
public class Symbol : ConfigurationElementCollection {

    [ConfigurationProperty("name", IsRequired = true, IsKey = true)]
    public String Name {
        get {
            return this["name"] as String;
        }
    }

    [ConfigurationProperty("template", IsRequired = false)]
    public String Template {
        get {
            return this["template"] as String;
        }
    }

    [ConfigurationProperty("dataname", IsRequired = false)]
    public String DataName {
        get {
            return this["dataname"] as String;
        }
    }

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

    protected override object GetElementKey(ConfigurationElement element) {
        return ((TemplateValue)element).Index;
    }
}

public class TemplateValue : ConfigurationElement {

    [ConfigurationProperty("index", IsRequired = false, IsKey = true)]
    public Int32 Index {
        get {
            return this["index"] == null ? -1 : Convert.ToInt32(this["index"]);
        }
    }

    [ConfigurationProperty("value", IsRequired = false)]
    public String Value {
        get {
            return this["value"] as String;
        }
    }
}

Когда я анализирую раздел с этим оператором: символы = ConfigurationManager.GetSection("EmailSymbols") как EmailSymbols;

Я получаю это сообщение об ошибке: "Нераспознанный элемент" Символ "."

Это просто область.NET, в которой я не разбираюсь. Любая помощь, которую кто-либо может оказать, будет очень цениться.

Имеет ли смысл мое определение XML и имеет ли оно правильную форму? Мне нужна коллекция SymbolClass, каждая из которых содержит коллекцию Symbol, каждая из которых содержит коллекцию TemplateValue.

Еще раз спасибо за вашу помощь.

С наилучшими пожеланиями, Джимми

1 ответ

Вы можете попытаться переопределить Init() метод SymbolClass учебный класс:

protected override void Init()
{
    base.Init();
    this.AddElementName = "Symbol";
}

Вы также удалите [ConfigurationCollection(typeof(SymbolClass), AddItemName = "SymbolClass")] и другим нравится это сверху объявлений класса, поскольку они ничего не делают.

Другие вопросы по тегам