Использование пользовательского метода из библиотеки для получения всех пар (ключ, значение) из App.config в c# - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь создать свою собственную библиотеку наиболее часто используемых методов / кода. Метод, над которым я сейчас работаю, предполагает чтение всех пар (значение, ключ) из предоставленного пользователем раздела из файла конфигурации и запись их в регистратор. Когда я преобразовал код в метод и переместил его в отдельный файл, я обнаружил проблему, связанную с расположением App.config .

Итак, у меня есть App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="General" type="System.Configuration.NameValueSectionHandler"/>
    <section name="Generalxxxxxxxxxxxxx" type="System.Configuration.NameValueSectionHandler"/>
  </configSections>
  <General>
    <add key="ApplicationName" value="Configuration Example Project"/>
    <add key="Language" value="CSharp"/>
    <add key="SecretKey" value="012345"/>
  </General>
  <Generalxxxxxxxxxxxxx>
    <add key="ApplicationName" value="Configuration Example Project"/>
    <add key="Language" value="CSharp"/>
    <add key="SecretKey" value="012345"/>
  </Generalxxxxxxxxxxxxx>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>
</configuration>

Из которого я мог прочитать все пары (ключ, значение), просто используя следующий код. В этом случае, когда все было в одном файле, мне не нужно было указывать местоположение App.config .

var general = ConfigurationManager.GetSection("General") as NameValueCollection;  
            if (applicationSettings.Count == 0)  
            {  
                Console.WriteLine("Application Settings are not defined");  
            }  
            else  
            {  
                foreach (var key in general.AllKeys)  
                {  
                    Console.WriteLine(key + " = " + applicationSettings[key]);  
                }  
            }  

Я нашел способ передать местоположение, но теперь могу t sectionLoad как NameValueCollection из-за ошибки преобразования, поэтому я не могу использовать AllKeys метод.

 public static Tuple<string, string> LogSaveConfig(string location, string sectionName)
        {

            //var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            var config = ConfigurationManager.OpenExeConfiguration(location);

            var sectionLoad = config.GetSection(sectionName);

            return Tuple.Create("key", "value"); //just temporary
        }

Также я сделал некоторую отладку в "sectionLoad" и единственное место, где я мог найти пары (ключ, значения), было необработанным XML: enter image description here

Мой вопрос, как я могу получить пары (ключ , значение), когда я вызываю файл конфигурации через метод, который является частью отдельной библиотеки? Моя цель - набрать MyLib.LoggerDefined.LogSaveConfig(location, section);, который будет регистрировать пары (ключ, значение) в регистраторе. Также, если мой подход неверен, пожалуйста, дайте мне знать. Спасибо.

1 Ответ

1 голос
/ 26 февраля 2020

Вы можете прочитать файл xml напрямую в формате xml. Я использовал xml linq и создал словарь

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication158
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            Dictionary<string, List<List<KeyValuePair<string, string>>>> dict = doc.Root.Elements()
                .GroupBy(x => x.Name.LocalName, y => y.Elements()
                    .Select(z => z.Attributes().Select(a => new KeyValuePair<string, string>(a.Name.LocalName, (string)a)).ToList()).ToList())
                    .ToDictionary(x => x.Key, y => y.FirstOrDefault());

        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...