【问题标题】:How to get some elements from app.config in C#?如何在 C# 中从 app.config 中获取一些元素?
【发布时间】:2012-07-31 04:40:40
【问题描述】:

根据我的 app.config,我希望能够获取列的元素,如下面的示例中的第 3-5 行所示。我应该如何编写代码来实现这一点。如果我需要更改我的 app.config - 我会这样做。

1. var bounceProviders = ConfigurationManager.GetSection("BounceProviders") as BounceProvidersSection;
2. var providerColumns = bounceProviders.Providers[0].Columns;
3. var emailColumn = providerColumns.Email;
4. var dateColumn = providerColumns.Date;
5. var messageColumn = providerColumns.Message;

app.config

<BounceProviders>
  <Providers>
    <Provider Name="p1">        
      <Columns>
          <Email Name="My Email" />
          <Date Name="My Date" />
          <Message Name="My Message" />               
      </Columns>
    </Provider>  
    <Provider Name="p2">
      <Columns />
    </Provider>    
  </Providers>
</BounceProviders>

配置部分

public class BounceProvidersSection : ConfigurationSection
{
    [ConfigurationCollection(typeof(ConfigCollection<BounceProviderConfig>), AddItemName = "Provider")]
    [ConfigurationProperty("Providers", IsRequired = true)]
    public ConfigCollection<BounceProviderConfig> Providers
    {
        get { return (ConfigCollection<BounceProviderConfig>)this["Providers"]; }
        set { this["Providers"] = value; }
    }                
}

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

配置集合

public class ConfigCollection<T> : ConfigurationElementCollection
        where T : ConfigurationElement, new()
{        
    protected override ConfigurationElement CreateNewElement()
    {
        return new T();
    }

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

    public T this[int index]
    {
        get
        {
            return ( T )BaseGet( index );
        }
        set
        {
            if ( BaseGet( index ) != null )
            {
                BaseRemoveAt( index );
            }
            BaseAdd( index, value );
        }
    }

    new public T this[string Name]
    {
        get
        {
            return ( T )BaseGet( Name );
        }
    }
}

sdf

【问题讨论】:

  • 一点提示:return element.GetHashCode():这是不正确的,哈希码并不是唯一的。您的代码在这里可能会陷入异常。

标签: c# c#-4.0 app-config configurationmanager


【解决方案1】:

我想通了

public class BounceProvidersSection : ConfigurationSection
{
    [ConfigurationCollection(typeof(ConfigCollection<BounceProviderConfig>), AddItemName = "Provider")]
    [ConfigurationProperty("Providers", IsRequired = true)]
    public ConfigCollection<BounceProviderConfig> Providers
    {
        get { return (ConfigCollection<BounceProviderConfig>)this["Providers"]; }
        set { this["Providers"] = value; }
    }                
}

public class BounceProviderConfig : ConfigurationElement
{
    [ConfigurationProperty("Id", IsRequired = true)]
    public int Id
    {
        get { return (int)this["Id"]; }
        set { this["Id"] = value; }
    }

    [ConfigurationProperty("Columns", IsRequired = false)]
    public BounceProviderColumns Columns
    {
        get { return (BounceProviderColumns)this["Columns"]; }
        set { this["Columns"] = value; }
    }

    public static BounceProviderConfig GetByProviderId(int providerId)
    {
        var section = ConfigUtils.GetConfigurationSection<BounceProvidersSection>("BounceProviders");
        foreach (BounceProviderConfig provider in section.Providers)
        {
            if (provider.Id == providerId)
                return provider;
        }

        return null;
    }
}

public class BounceProviderColumns : ConfigurationElement
{
    [ConfigurationProperty("Email", IsRequired = true)]
    public ColumnConfig Email
    {
        get { return (ColumnConfig)this["Email"]; }
        set { this["Email"] = value; }
    }

    [ConfigurationProperty("Date", IsRequired = true)]
    public DateColumnConfig Date
    {
        get { return (DateColumnConfig)this["Date"]; }
        set { this["Date"] = value; }
    }

    [ConfigurationProperty("Message", IsRequired = true)]
    public ColumnConfig Message
    {
        get { return (ColumnConfig)this["Message"]; }
        set { this["Message"] = value; }
    }        
}

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

【讨论】:

    猜你喜欢
    • 2014-03-23
    • 2020-04-22
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    相关资源
    最近更新 更多