Доступ к разделу пользовательской конфигурации в .NET

Это довольно легко, используя Regex:

var result = Regex.Replace("a1b2c3d4", @"\d", "");

(как отмечает @Adassko, вы можете использовать "[0-9]" вместо @"\d", если вы просто хотите, чтобы цифры от 0 до 9, а не любые другие числовые символы).

Вы также можете сделать это довольно эффективно, используя StringBuilder:

var sb = new StringBuilder();
foreach (var ch in "a1b2c3d4")
{
    if (!char.IsNumber(ch))
    {
        sb.Append(ch);
    }   
}

var result = sb.ToString();

Вы также можете сделать это с помощью linq:

 var result = new string("a1b2c3d4".Where(x => !char.IsNumber(x)).ToArray());
7
задан Damien 2 April 2009 в 16:16
поделиться

6 ответов

Вот вырезанный и вставленный от чего-то очень похожего, которое я сделал несколько дней назад.

Конфигурация:

  <ListConfigurations>
    <lists>
      <add Name="blah" EndpointConfigurationName="blah" ListName="blah" ConnectionString="blah" TableName="blah" FieldsCsv="blah" DbFieldsCsv="blah"/>
      <add Name="blah2" EndpointConfigurationName="blah" ListName="blah" ConnectionString="blah" TableName="blah" FieldsCsv="blah" DbFieldsCsv="blah"/>
    </lists>
  </ListConfigurations>

Раздел C# конфигурации:

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

namespace App
{
    /// <summary>
    /// Individual list configuration
    /// </summary>
    class ListConfiguration : ConfigurationElement
    {
        [ConfigurationProperty("Name", IsKey = true, IsRequired = true)]
        public string Name
        {
            get { return (string)this["Name"]; }
        }

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

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

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

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

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

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

    /// <summary>
    /// Collection of list configs
    /// </summary>
    class ListConfigurationCollection : ConfigurationElementCollection
    {
        protected override ConfigurationElement CreateNewElement()
        {
            return new ListConfiguration();
        }

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

    /// <summary>
    /// Config section
    /// </summary>
    class ListConfigurationSection : ConfigurationSection
    {
        [ConfigurationProperty("lists")]
        public ListConfigurationCollection Lists
        {
            get { return (ListConfigurationCollection)this["lists"]; }
        }
    }
}

И код для собирания его от главного приложения:

ListConfigurationSection configSection = null;
try
{
    configSection = ConfigurationManager.GetSection("ListConfigurations") as ListConfigurationSection;
}
catch (System.Configuration.ConfigurationErrorsException)
{
}
7
ответ дан 6 December 2019 в 12:54
поделиться

Нет никакого серьезного основания разрабатывать этот вид материала вручную больше. Скорее необходимо использовать Разработчика Раздела Конфигурации на CodePlex:

http://csd.codeplex.com/

После того, как установленный, можно просто добавить новый объект к проекту (разработчик раздела конфигурации) и затем добавить элементы и ограничения. Я нашел это ОЧЕНЬ простым в использовании, и я никогда не буду, вероятно, писать часть кода для конфигурационных файлов снова.

7
ответ дан 6 December 2019 в 12:54
поделиться

Мой VB не очень жаль, но здесь - как Вы делаете это в C#.

C#

public class AppState : IConfigurationSectionHandler
{
    static AppState()
    {
        xmlNode myConfigNode = (XmlNode)ConfigurationManager.GetSection("databases");
    }

    public object Create(object parent, object context, XmlNode configSection) {
        return configSection;
    }
}

Приложение. Конфигурация

<configuration>
  <configSections>
    <section name="databases" type="MyAssembly.AppState, MyAssembly" />
  </configSections>
  <databases>
    <database name="DatabaseOne" Value="[value]" />
    <database name="DatabaseTwo" Value="[value]" />
  </databases>
</configuration>
0
ответ дан 6 December 2019 в 12:54
поделиться

Можно использовать этот обработчик конфигураций вместо этого.. Это будет работать на ВСЕ разделы пользовательской конфигурации

   public class XmlConfigurator : IConfigurationSectionHandler
    {
        public object Create(object parent, 
                   object configContext, XmlNode section)
        {
            if (section == null) 
                throw new ArgumentNullException("section",
                    "Invalid or missing configuration section " + 
                    "provided to XmlConfigurator");
            XPathNavigator xNav = section.CreateNavigator();
            if (xNav == null) 
                throw new ApplicationException(
                    "Unable to create XPath Navigator"); 
            Type sectionType = Type.GetType((string)
                (xNav).Evaluate("string(@configType)"));
            XmlSerializer xs = new XmlSerializer(sectionType);
            return xs.Deserialize(new XmlNodeReader(section));
        }
    }

Ваш файл конфигурации затем должен включать ссылку на тип что представление корневого элемента

<ConnectionConfig 
   configType="MyNamespace.ConnectionConfig, MyNamespace.AssmblyName" >

Демонстрационный файл конфигурации мог бы быть похожим на это:

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

<ConnectionConfig 
   configType="MyNamespace.ConnectionConfig, MyNamespace.AssmblyName" >

  <ConnCompanys>
    <ConnCompany companyName="CompanyNameHere">
      <ConnApps>
        <ConnApp applicationName="Athena" vendorName="Oracle" >
          <ConnSpecs>
            <ConnSpec environments="DEV"
              serverName="Athena"
              port="1521"
              catalog="DatabaseName"
              logon="MyUserName"
              password="%%552355%8234^kNfllceHGp55X5g==" />
     <!--  etc...

И необходимо будет определить классы, которые каждый xml элемент отображает на... использование соответствующих атрибутов XmlSerialization...

[XmlRoot("ConnectionConfig")]
public class ConnectionConfig
{
    private ConnCompanys comps;

    [XmlArrayItem(ElementName = "ConnCompany")]
    public ConnCompanys ConnCompanys
    {
        get { return comps; }
        set { comps = value; }
    }
    public ConnApp this[string CompanyName, string AppName]
    { get { return ConnCompanys[CompanyName][AppName]; } }

    public ConnSpec this[string CompanyName, string AppName, APPENV env]
    {
        get
        {
            return ConnCompanys[CompanyName][AppName, env];
        }
    }
}

public class ConnCompanys : List<ConnCompany>
{
    public ConnCompany this[string companyName]
    {
        get
        {
            foreach (ConnCompany comp in this)
                if (comp.CompanyName == companyName)
                    return comp;
            return null;
        }
    }
    public bool Contains(string companyName)
    {
        foreach (ConnCompany comp in this)
            if (comp.CompanyName == companyName)
                return true;
        return false;
    }
}

public class ConnCompany
{
    #region private state fields
    private string compNm;
    private ConnApps apps;
    #endregion private state fields

    #region public properties
    [XmlAttribute(DataType = "string", AttributeName = "companyName")]
    public string CompanyName
    {
        get { return compNm; }
        set { compNm = value; }
    }

    [XmlArrayItem(ElementName = "ConnApp")]
    public ConnApps ConnApps
    {
        get { return apps; }
        set { apps = value; }
    }
    #endregion public properties

    #region indexers
    public ConnApp this[string applicationName]
    { get { return ConnApps[applicationName]; } }
    public ConnSpec this[string applicationName, APPENV environment]
    {
        get
        {
            foreach (ConnSpec con in this[applicationName].ConnSpecs)
                if (con.Environment == environment)
                    return con;
            return null;
        }
    }
    #endregion indexers
}

и т.д...

2
ответ дан 6 December 2019 в 12:54
поделиться

Возможно, вам будет интересно использовать ConfigurationElementCollection, где T - это тип дочерних элементов ConfigurationElements. Вы можете найти образец кода на C # по адресу http://devpinoy.org/blogs/jakelite/archive/2009/01/10/iconfigurationsectionhandler-is-dead-long-live-iconfigurationsectionhandler.aspx

Ура!

0
ответ дан 6 December 2019 в 12:54
поделиться

Здесь также продемонстрирован прекрасный простой способ сделать это:

codeproject.com/KB/XML/xml_config_section.aspx

0
ответ дан 6 December 2019 в 12:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: