Настроенный IEnumerable в ConfigurationSection II

Original question and code: Customized IEnumerable in ConfigurationSection

Продвижение в решении этого и с @Daniel Hilgarth отвечает, что я изменил (app.config) это:

этому:

    

Теперь, у меня есть это другое исключение:

System.Configuration.ConfigurationErrorsException was unhandled
  HResult=-2146232062
  Message=Unrecognized element 'Path'. (C:\Users\blackberry\Desktop\ConsoleApplication1_ConfigurationEnumerable\ConsoleApplication1_ConfigurationEnumerable\bin\Debug\ConsoleApplication1_ConfigurationEnumerable.vshost.exe.config line 9)
  Source=System.Configuration
  BareMessage=Unrecognized element 'Path'.
  Filename=C:\Users\blackberry\Desktop\ConsoleApplication1_ConfigurationEnumerable\ConsoleApplication1_ConfigurationEnumerable\bin\Debug\ConsoleApplication1_ConfigurationEnumerable.vshost.exe.config
  Line=9
  StackTrace:
       at System.Configuration.BaseConfigurationRecord.EvaluateOne(String[] keys, SectionInput input, Boolean isTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult)
       at System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult, Boolean getLkg, Boolean getRuntimeObject, Object& result, Object& resultRuntimeObject)
       at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
       at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
       at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
       at System.Configuration.BaseConfigurationRecord.GetSection(String configKey)
       at System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(String sectionName)
       at System.Configuration.ConfigurationManager.GetSection(String sectionName)
       at ConsoleApplication1_ConfigurationEnumerable.PathsConfigSection.GetConfig() in C:\Users\blackberry\Desktop\ConsoleApplication1_ConfigurationEnumerable\ConsoleApplication1_ConfigurationEnumerable\Disk.cs:line 63
       at ConsoleApplication1_ConfigurationEnumerable.Program.Main(String[] args) in C:\Users\blackberry\Desktop\ConsoleApplication1_ConfigurationEnumerable\ConsoleApplication1_ConfigurationEnumerable\Program.cs:line 9
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException:
0
Я отредактировал ваш титул. Пожалуйста, посмотрите,"Вопросы должны включать “признаки” в свои названия?", где согласие "нет, они не должны".
добавлено автор John Saunders, источник

2 ответы

Попытайтесь добавить следующий признак к вашему PathsConfigSection. Пути собственность:

    [ConfigurationCollection(typeof(Paths), AddItemName = "Path")]

Это должно теперь быть похожим на это:

    [ConfigurationProperty("Paths")]
    [ConfigurationCollection(typeof(Paths), AddItemName = "Path")]
    public Paths Paths
    {
        get
        {
            var o = this["Paths"];
            return o as Paths;
        }
    }
1
добавлено
@Monkieboy: Спасибо. Но я не уверен, почему вы повторяете мой ответ. Какую стоимость вы видите в выполнении этого?
добавлено автор Daniel Hilgarth, источник
@Monkieboy: Если вы думаете, что ваш ответ увеличивает стоимость, уезжайте, это, никакая проблема там. Я думаю, что Ferpega попросил бы разъяснение если это все еще didn' t работа. Необходимо дать ему некоторое время, чтобы проверить его - или даже понять, что есть ответ;)
добавлено автор Daniel Hilgarth, источник
@Monkieboy: Вы, конечно, didn' t раздражают любого и меня didn' t просят, чтобы вы удалили свой ответ. Держите прохладный:-),
добавлено автор Daniel Hilgarth, источник
+1 Ваш совет абсолютно точечный на.
добавлено автор Mr. Mr., источник
Я не мог вписаться в комментарий, и @Ferpega не отметил ваш ответ как полный, я предполагаю, что он не нашел решения. Я использовал ваш совет в качестве платформы, чтобы предоставить решение, я рад удалить свой ответ, если вы чувствуете, что я не добавляю ясность или стоимость к этому вопросу.
добавлено автор Mr. Mr., источник
Хорошо, пожалуйста, простите мне меня don' t хотят раздражать вас или кого-либо еще. Я удалю свой вклад.
добавлено автор Mr. Mr., источник

Ваша конфигурация должна быть похожей на это теперь:

<?xml version="1.0" encoding="utf-8" ?>

  
    

Ваши классы должны теперь быть похожими на это:

using System.Configuration;

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        var t = DiskConfigSection.GetConfig();
       //Put a breakpoint on the line after this and put a watch on t
    }
}

public class Path : ConfigurationElement
{
    [ConfigurationProperty("name", IsRequired = true)]
    public string Name
    {
        get
        {
            return (string)this["name"];
        }
    }

    [ConfigurationProperty("permission", IsRequired = true)]
    public string Permission
    {
        get
        {
            return (string)this["permission"];
        }
    }
}

public class Paths : ConfigurationElementCollection
{
    public Path this[int index]
    {
        get
        {
            return BaseGet(index) as Path;
        }
        set
        {
            if (BaseGet(index) != null)
            {
                BaseRemoveAt(index);
            }
            BaseAdd(index, value);
        }
    }

    protected override ConfigurationElement CreateNewElement()
    {
        return new Path();
    }
    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((Path)element).Name;
    }
}

public class DiskConfigSection : ConfigurationSection
{
    public static DiskConfigSection GetConfig()
    {
        var b = ConfigurationManager.GetSection("Disk") != null;
        return b ? (DiskConfigSection)ConfigurationManager.GetSection("Disk") : new DiskConfigSection();
    }

    [ConfigurationProperty("Paths")]
    [ConfigurationCollection(typeof(Paths), AddItemName = "Path")]
    public Paths Paths
    {
        get
        {
            var o = this["Paths"];
            return o as Paths;
        }
    }
}
}

Я проверил в приложении пульта и грузах конфигурации полностью.

1
добавлено
Кредит к @DanielHilgarth, которым это было из-за его комментариев, я смог построить это.
добавлено автор Mr. Mr., источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot