正确实现带有嵌套集合的自定义配置部分?

如何解决正确实现带有嵌套集合的自定义配置部分?

| 在Web应用程序中,我希望能够使用config这样的部分来定义一些映射:
<configuration>
    <configSections>
        <sectionGroup name=\"MyCustomer\">
            <section name=\"CatalogMappings\" type=\"MyCustom.MyConfigSection\" />
        </sectionGroup>
    </configSections>
    <MyCustomer>
        <catalogMappings>
            <catalog name=\"toto\">
                <mapping value=\"1\" displayText=\"titi\" />
                <mapping value=\"2\" displayText=\"tata\" />
            </catalog>
            <catalog name=\"toto2\">
                <mapping value=\"1\" displayText=\"titi2\" />
                <mapping value=\"2\" displayText=\"tata2\" />
            </catalog>
        </catalogMappings>
    </MyCustomer>
</configuration>
我正在努力实现这一目标,尤其是在定义收藏夹时。我需要实现哪些类才能实现这一目标? 目前,我有:
public class CatalogMappingSection : System.Configuration.ConfigurationSection
{
    public class Mapping : ConfigurationElement
    {
        [ConfigurationProperty(\"externalKey\")]
        public string ExternalKey { get; set; }
        [ConfigurationProperty(\"displayText\",IsRequired=true)]
        public string DisplayText { get; set; }
        [ConfigurationProperty(\"value\",IsRequired=true,IsKey=true)]
        public int Value { get; set; }
    }

    public class Catalog : ConfigurationElementCollection
    {
        [ConfigurationProperty(\"name\",IsKey=true)]
        public string Name { get; set; }

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

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

    public class CatalogCollection : ConfigurationElementCollection
    {
        [ConfigurationProperty(\"catalog\")]
        [ConfigurationCollection(typeof(Catalog))]
        public Catalog CatalogMappingCollection
        {
            get
            {
                return (Catalog)base[\"catalog\"];
            }
        }

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

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

    [ConfigurationProperty(\"catalogMappings\")]
    [ConfigurationCollection(typeof(CatalogCollection))]
    public CatalogCollection CatalogMappings
    {
        get
        {
            return (CatalogCollection)base[\"catalogMappings\"];
        }
    }
}
但是,这没有按预期工作。     

解决方法

我终于找到了这个家伙的榜样。它是经过编码和开箱即用的。 http://manyrootsofallevilrants.blogspot.com/2011/07/nested-custom-configuration-collections.html 我将代码粘贴到这里……只是因为当有人说“您的答案在这里”并且链接无效时,我无法忍受它。 请先尝试他的网站,如果可以的话请留下“谢谢”。
using System;
using System.Configuration;

namespace SSHTunnelWF
{
    public class TunnelSection : ConfigurationSection
    {
        [ConfigurationProperty(\"\",IsDefaultCollection = true)]  
        public HostCollection Tunnels
        {
            get
            {
                HostCollection hostCollection = (HostCollection)base[\"\"];
                return hostCollection;                
            }
        }
    }

    public class HostCollection : ConfigurationElementCollection
    {
        public HostCollection()
        {
            HostConfigElement details = (HostConfigElement)CreateNewElement();
            if (details.SSHServerHostname != \"\")
            {
                Add(details);
            }
        }

        public override ConfigurationElementCollectionType CollectionType
        {
            get
            {
                return ConfigurationElementCollectionType.BasicMap;
            }
        }

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

        protected override Object GetElementKey(ConfigurationElement element)
        {
            return ((HostConfigElement)element).SSHServerHostname;
        }

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

        new public HostConfigElement this[string name]
        {
            get
            {
                return (HostConfigElement)BaseGet(name);
            }
        }

        public int IndexOf(HostConfigElement details)
        {
            return BaseIndexOf(details);
        }

        public void Add(HostConfigElement details)
        {
            BaseAdd(details);
        }

        protected override void BaseAdd(ConfigurationElement element)
        {
            BaseAdd(element,false);
        }

        public void Remove(HostConfigElement details)
        {
            if (BaseIndexOf(details) >= 0)
                BaseRemove(details.SSHServerHostname);
        }

        public void RemoveAt(int index)
        {
            BaseRemoveAt(index);
        }

        public void Remove(string name)
        {
            BaseRemove(name);
        }

        public void Clear()
        {
            BaseClear();
        }

        protected override string ElementName
        {
            get { return \"host\"; }
        }
    }

    public class HostConfigElement:ConfigurationElement
    {
        [ConfigurationProperty(\"SSHServerHostname\",IsRequired = true,IsKey = true)]
        [StringValidator(InvalidCharacters = \"  ~!@#$%^&*()[]{}/;’\\\"|\\\\\")]
        public string SSHServerHostname
        {
            get { return (string)this[\"SSHServerHostname\"]; }
            set { this[\"SSHServerHostname\"] = value; }
        }

        [ConfigurationProperty(\"username\",IsRequired = true)]
        [StringValidator(InvalidCharacters = \"  ~!@#$%^&*()[]{}/;’\\\"|\\\\\")]
        public string Username
        {
            get { return (string)this[\"username\"]; }
            set { this[\"username\"] = value; }
        }

        [ConfigurationProperty(\"SSHport\",DefaultValue = 22)]
        [IntegerValidator(MinValue = 1,MaxValue = 65536)]
        public int SSHPort
        {
            get { return (int)this[\"SSHport\"]; }
            set { this[\"SSHport\"] = value; }
        }

        [ConfigurationProperty(\"password\",IsRequired = false)]
        public string Password
        {
            get { return (string)this[\"password\"]; }
            set { this[\"password\"] = value; }
        }

        [ConfigurationProperty(\"privatekey\",IsRequired = false)]
        public string Privatekey
        {
            get { return (string)this[\"privatekey\"]; }
            set { this[\"privatekey\"] = value; }
        }

        [ConfigurationProperty(\"privatekeypassphrase\",IsRequired = false)]
        public string Privatekeypassphrase
        {
            get { return (string)this[\"privatekeypassphrase\"]; }
            set { this[\"privatekeypassphrase\"] = value; }
        }

        [ConfigurationProperty(\"tunnels\",IsDefaultCollection = false)]
        public TunnelCollection Tunnels
        {
            get { return (TunnelCollection)base[\"tunnels\"]; }
        }
    }

    public class TunnelCollection : ConfigurationElementCollection
    {
        public new TunnelConfigElement this[string name]
        {
            get
            {
                if (IndexOf(name) < 0) return null;
                return (TunnelConfigElement)BaseGet(name);
            }
        }

        public TunnelConfigElement this[int index]
        {
            get { return (TunnelConfigElement)BaseGet(index); }
        }

        public int IndexOf(string name)
        {
            name = name.ToLower();

            for (int idx = 0; idx < base.Count; idx++)
            {
                if (this[idx].Name.ToLower() == name)
                    return idx;
            }
            return -1;
        }

        public override ConfigurationElementCollectionType CollectionType
        {
            get { return ConfigurationElementCollectionType.BasicMap; }
        }

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

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

        protected override string ElementName
        {
            get { return \"tunnel\"; }
        }
    }

    public class TunnelConfigElement : ConfigurationElement
    {        
        public TunnelConfigElement()
        {
        }

        public TunnelConfigElement(string name,int localport,int remoteport,string destinationserver)
        {
            this.DestinationServer = destinationserver;
            this.RemotePort = remoteport;
            this.LocalPort = localport;            
            this.Name = name;
        }

        [ConfigurationProperty(\"name\",IsKey = true,DefaultValue = \"\")]       
        public string Name
        {
            get { return (string)this[\"name\"]; }
            set { this[\"name\"] = value; }
        }        

        [ConfigurationProperty(\"localport\",DefaultValue =1)]
        [IntegerValidator(MinValue = 1,MaxValue = 65536)]
        public int LocalPort
        {
            get { return (int)this[\"localport\"]; }
            set { this[\"localport\"] = value; }
        }

        [ConfigurationProperty(\"remoteport\",MaxValue = 65536)]
        public int RemotePort
        {
            get { return (int)this[\"remoteport\"]; }
            set { this[\"remoteport\"] = value; }
        }

        [ConfigurationProperty(\"destinationserver\",IsRequired = true)]
        [StringValidator(InvalidCharacters = \"  ~!@#$%^&*()[]{}/;’\\\"|\\\\\")]
        public string DestinationServer
        {
            get { return (string)this[\"destinationserver\"]; }
            set { this[\"destinationserver\"] = value; }
        }
    }
}
     和配置代码
 <?xml version=\"1.0\"?>
 <configuration>
   <configSections>
     <section name=\"TunnelSection\" type=\"SSHTunnelWF.TunnelSection,SSHTunnelWF\" />
   </configSections>
   <TunnelSection>
     <host SSHServerHostname=\"tsg.edssdn.net\" username=\"user\" SSHport=\"22\" password=\"pass\" privatekey=\"\" privatekeypassphrase=\"\">
       <tunnels>
         <tunnel name=\"tfs\" localport=\"8081\"  remoteport=\"8080\" destinationserver=\"tfs2010.dev.com\"  />
         <tunnel name=\"sql\" localport=\"14331\"  remoteport=\"1433\" destinationserver=\"sql2008.dev.com\"  />
         <tunnel name=\"crm2011app\" localport=\"81\"  remoteport=\"80\" destinationserver=\"crm2011betaapp.dev.com\"  />
       </tunnels>
     </host>
     <host SSHServerHostname=\"blade16\" username=\"root\" SSHport=\"22\"  password=\"pass\" privatekey=\"\" privatekeypassphrase=\"\">
      <tunnels>
        <tunnel name=\"vnc\" localport=\"5902\"  remoteport=\"5902\" destinationserver=\"blade1.dev.com\" />
      </tunnels>
     </host>
   </TunnelSection>
 </configuration>
     然后“打电话”
TunnelSection tunnels = ConfigurationManager.GetSection(\"TunnelSection\") as TunnelSection
    ,由于其他答案的受欢迎程度,我编写了一个使用美国州和美国县的自定义示例。这个例子比较容易理解。 我还添加了一些接口,这些接口允许对单元测试进行模拟,而当我编写此原始答案时,我并没有完全意识到这一点。 我还添加了将设置放置在其自己的文件中的功能,因此您的app.config文件中没有十亿个东西。 我还添加了一个“ Finder”来封装对集合中特定项目的搜索。 我还添加了自定义枚举。 \“ UsaStatesSettings.config \”(确保将其标记为\“始终复制\”)
<?xml version=\"1.0\" encoding=\"utf-8\" ?>
<UsaStateDefinitionConfigurationSectionName>
  <usaStateDefinition usaStateFullName=\"Virginia\" usaStateAbbreviation=\"VA\" countyLabelName=\"County\" usaStateDefinitionUniqueIdentifier=\"111\" isContenential=\"true\" >
    <usaCounties>
      <usaCounty usaCountyValue=\"Bath\" />
      <usaCounty usaCountyValue=\"Bedford\" />
      <usaCounty usaCountyValue=\"Bland\" />
    </usaCounties>
  </usaStateDefinition>
  <!-- -->
  <usaStateDefinition usaStateFullName=\"North Carolina\" usaStateAbbreviation=\"NC\" countyLabelName=\"County\" usaStateDefinitionUniqueIdentifier=\"222\" isContenential=\"true\" >
    <usaCounties>
      <usaCounty usaCountyValue=\"Catawba\" />
      <usaCounty usaCountyValue=\"Chatham\" />
      <usaCounty usaCountyValue=\"Chowan\" />
    </usaCounties>
  </usaStateDefinition>
  <!-- -->
  <usaStateDefinition usaStateFullName=\"Alaska\" usaStateAbbreviation=\"AK\" countyLabelName=\"Borough\" usaStateDefinitionUniqueIdentifier=\"333\" isContenential=\"false\" >
    <usaCounties>
      <usaCounty usaCountyValue=\"Aleutians East\" />
    </usaCounties>
  </usaStateDefinition>
  <!-- -->
  <usaStateDefinition usaStateFullName=\"Lousiania\" usaStateAbbreviation=\"LA\" countyLabelName=\"Parish\" usaStateDefinitionUniqueIdentifier=\"444\" isContenential=\"true\" >
    <usaCounties>
      <usaCounty usaCountyValue=\"Acadia\" />
    </usaCounties>
  </usaStateDefinition>
</UsaStateDefinitionConfigurationSectionName>
\“ app.config \”
<?xml version=\"1.0\" encoding=\"utf-8\" ?>
<configuration>

  <configSections>

    <section name=\"UsaStateDefinitionConfigurationSectionName\" type=\"GranadaCoder.CustomConfigurationExample.Configuration.UsaStateDefinitionConfigurationSection,GranadaCoder.CustomConfigurationExample.Configuration\" />
  </configSections>


  <UsaStateDefinitionConfigurationSectionName configSource=\"UsaStatesSettings.config\" />

  <startup> 
        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5\" />
    </startup>
</configuration>
现在是“代码”
/**/

// file=\"CaseInsensitiveEnumConfigurationValueConverter.cs\"

using System;
using System.ComponentModel;
using System.Configuration;
using System.Globalization;

namespace GranadaCoder.CustomConfigurationExample.Configuration
{
    public class CaseInsensitiveEnumConfigurationValueConverter<T> : ConfigurationConverterBase
    {
        public override object ConvertFrom(ITypeDescriptorContext ctx,CultureInfo ci,object data)
        {
            return Enum.Parse(typeof(T),(string)data,true);
        }
    }
}


/**/


// file=\"UsaCountyCollection.cs\"


using System.Collections.Generic;
using System.Configuration;

namespace GranadaCoder.CustomConfigurationExample.Configuration
{
    [ConfigurationCollection(typeof(UsaCountyConfigurationElement))]
    public class UsaCountyCollection : ConfigurationElementCollection,IEnumerable<UsaCountyConfigurationElement>
    {
        public override ConfigurationElementCollectionType CollectionType
        {
            get { return ConfigurationElementCollectionType.BasicMap; }
        }

        protected override string ElementName
        {
            get { return \"usaCounty\"; }
        }

        public UsaCountyConfigurationElement this[int index]
        {
            get { return (UsaCountyConfigurationElement)BaseGet(index); }
        }

        public new UsaCountyConfigurationElement this[string name]
        {
            get
            {
                if (this.IndexOf(name) < 0)
                {
                    return null;
                }

                return (UsaCountyConfigurationElement)BaseGet(name);
            }
        }

        public void Add(UsaCountyConfigurationElement newItem)
        {
            this.BaseAdd(newItem);
        }

        public int IndexOf(string usaCountyValue)
        {
            for (int idx = 0; idx < this.Count; idx++)
            {
                if (this[idx].UsaCountyValue.ToLower(System.Globalization.CultureInfo.CurrentCulture) == usaCountyValue.ToLower(System.Globalization.CultureInfo.CurrentCulture))
                {
                    return idx;
                }
            }

            return -1;
        }

        public new IEnumerator<UsaCountyConfigurationElement> GetEnumerator()
        {
            int count = this.Count;

            for (int i = 0; i < count; i++)
            {
                yield return this.BaseGet(i) as UsaCountyConfigurationElement;
            }
        }

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

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



/**/




// file=\"UsaCountyConfigurationElement.cs\"




using System.ComponentModel;
using System.Configuration;

namespace GranadaCoder.CustomConfigurationExample.Configuration
{
    [System.Diagnostics.DebuggerDisplay(\"UsaCountyValue=\'{UsaCountyValue}\'\")]
    public class UsaCountyConfigurationElement : ConfigurationElement
    {
        private const string UsaCountyValuePropertyName = \"usaCountyValue\";

        public UsaCountyConfigurationElement()
        {
        }

        public UsaCountyConfigurationElement(string usaCountyValue)
        {
            this.UsaCountyValue = usaCountyValue;
        }

        [ConfigurationProperty(UsaCountyValuePropertyName,DefaultValue = \"\")]
        [StringValidator(InvalidCharacters = \"~!@#$%^&*()[]{}/;’\\\"|\\\\\")]
        public string UsaCountyValue
        {
            get { return (string)this[UsaCountyValuePropertyName]; }
            set { this[UsaCountyValuePropertyName] = value; }
        }
    }
}


/**/




// file=\"UsaCountyLabelEnum.cs\"




namespace GranadaCoder.CustomConfigurationExample.Configuration
{
    public enum UsaCountyLabelEnum
    {
        Unknown,County,Parish,Borough
    }
}


/**/




// file=\"UsaStateDefinitionCollection.cs\"




using System;
using System.Collections.Generic;
using System.Configuration;

using GranadaCoder.CustomConfigurationExample.Configuration.Interfaces;

namespace GranadaCoder.CustomConfigurationExample.Configuration
{
    [ConfigurationCollection(typeof(UsaStateDefinitionConfigurationElement))]
    public class UsaStateDefinitionCollection : ConfigurationElementCollection,IUsaStateDefinitionCollection
    {
        public UsaStateDefinitionCollection()
        {
            UsaStateDefinitionConfigurationElement details = (UsaStateDefinitionConfigurationElement)this.CreateNewElement();
            if (!string.IsNullOrEmpty(details.UsaStateFullName))
            {
                this.Add(details);
            }
        }

        public override ConfigurationElementCollectionType CollectionType
        {
            get
            {
                return ConfigurationElementCollectionType.BasicMap;
            }
        }

        bool ICollection<UsaStateDefinitionConfigurationElement>.IsReadOnly
        {
            get
            {
                return false;
            }
        }

        protected override string ElementName
        {
            get { return \"usaStateDefinition\"; }
        }

        public UsaStateDefinitionConfigurationElement this[int index]
        {
            get
            {
                return (UsaStateDefinitionConfigurationElement)BaseGet(index);
            }

            set
            {
                if (this.BaseGet(index) != null)
                {
                    this.BaseRemoveAt(index);
                }

                this.BaseAdd(index,value);
            }
        }

        public new UsaStateDefinitionConfigurationElement this[string name]
        {
            get
            {
                return (UsaStateDefinitionConfigurationElement)this.BaseGet(name);
            }
        }

        public int IndexOf(UsaStateDefinitionConfigurationElement details)
        {
            return this.BaseIndexOf(details);
        }

        public void Add(UsaStateDefinitionConfigurationElement newItem)
        {
            this.BaseAdd(newItem);
        }

        public bool Remove(UsaStateDefinitionConfigurationElement details)
        {
            if (this.BaseIndexOf(details) >= 0)
            {
                this.BaseRemove(details.UsaStateFullName);
                return true;
            }

            return false;
        }

        public void RemoveAt(int index)
        {
            this.BaseRemoveAt(index);
        }

        public void Remove(string name)
        {
            this.BaseRemove(name);
        }

        public void Clear()
        {
            this.BaseClear();
        }

        public bool Contains(UsaStateDefinitionConfigurationElement item)
        {
            if (this.IndexOf(item) >= 0)
            {
                return true;
            }

            return false;
        }

        public void CopyTo(UsaStateDefinitionConfigurationElement[] array,int arrayIndex)
        {
            throw new NotImplementedException();
        }

        public void Insert(int index,UsaStateDefinitionConfigurationElement item)
        {
            this.BaseAdd(index,item);
        }

        public new IEnumerator<UsaStateDefinitionConfigurationElement> GetEnumerator()
        {
            int count = this.Count;

            for (int i = 0; i < count; i++)
            {
                yield return this.BaseGet(i) as UsaStateDefinitionConfigurationElement;
            }
        }

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

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

        protected override void BaseAdd(ConfigurationElement element)
        {
            this.BaseAdd(element,false);
        }
    }
}


/**/




// file=\"UsaStateDefinitionConfigurationElement.cs\"




using System;
using System.ComponentModel;
using System.Configuration;

namespace GranadaCoder.CustomConfigurationExample.Configuration
{
    [System.Diagnostics.DebuggerDisplay(\"UsaStateFullName = \'{UsaStateFullName}\'\")]
    public class UsaStateDefinitionConfigurationElement : ConfigurationElement
    {
        private const string UsaStateFullNamePropertyName = \"usaStateFullName\";
        private const string UsaStateAbbreviationPropertyName = \"usaStateAbbreviation\";
        private const string UsaStateDefinitionUniqueIdentifierPropertyName = \"usaStateDefinitionUniqueIdentifier\";
        private const string IsContenentialPropertyName = \"isContenential\";
        private const string CountyLabelNamePropertyName = \"countyLabelName\";

        private const string UsaCountiesPropertyName = \"usaCounties\";
        private const string ServiceBusQueuesPropertyName = \"serviceBusQueues\";

        [ConfigurationProperty(UsaStateFullNamePropertyName,IsKey = true)]
        [StringValidator(InvalidCharacters = \"~!@#$%^&*()[]{}/;’\\\"|\\\\\")]
        public string UsaStateFullName
        {
            get { return (string)this[UsaStateFullNamePropertyName]; }
            set { this[UsaStateFullNamePropertyName] = value; }
        }

        [ConfigurationProperty(UsaStateAbbreviationPropertyName,IsKey = true)]
        [StringValidator(InvalidCharacters = \"  ~!@#$%^&*()[]{}/;’\\\"|\\\\\")]
        public string UsaStateAbbreviation
        {
            get { return (string)this[UsaStateAbbreviationPropertyName]; }
            set { this[UsaStateAbbreviationPropertyName] = value; }
        }

        [ConfigurationProperty(UsaStateDefinitionUniqueIdentifierPropertyName,IsRequired = true)]
        public int UsaStateDefinitionUniqueIdentifier
        {
            get { return (int)this[UsaStateDefinitionUniqueIdentifierPropertyName]; }
            set { this[UsaStateDefinitionUniqueIdentifierPropertyName] = value; }
        }

        [ConfigurationProperty(IsContenentialPropertyName,IsRequired = true)]
        public bool IsContenential
        {
            get { return (bool)this[IsContenentialPropertyName]; }
            set { this[IsContenentialPropertyName] = value; }
        }

        [ConfigurationProperty(UsaCountiesPropertyName,IsDefaultCollection = false)]
        public UsaCountyCollection UsaCounties
        {
            get { return (UsaCountyCollection)base[UsaCountiesPropertyName]; }
            set { this[UsaCountiesPropertyName] = value; } /* set is here for UnitTests */
        }

        [ConfigurationProperty(CountyLabelNamePropertyName,DefaultValue = UsaCountyLabelEnum.Unknown)]
        [TypeConverter(typeof(CaseInsensitiveEnumConfigurationValueConverter<UsaCountyLabelEnum>))]
        public UsaCountyLabelEnum CountyLabelType
        {
            get
            {
                return (UsaCountyLabelEnum)this[CountyLabelNamePropertyName];
            }

            set
            {
                base[CountyLabelNamePropertyName] = value;
            }
        }
    }
}



/**/




// file=\"UsaStateDefinitionConfigurationRetriever.cs\"




using System;
using System.Configuration;
using System.Linq;

using GranadaCoder.CustomConfigurationExample.Configuration.Interfaces;

namespace GranadaCoder.CustomConfigurationExample.Configuration
{
    public class UsaStateDefinitionConfigurationRetriever : IUsaStateDefinitionConfigurationSectionRetriever
    {
        public static readonly string ConfigurationSectionName = \"UsaStateDefinitionConfigurationSectionName\";

        public IUsaStateDefinitionConfigurationSection GetIUsaStateDefinitionConfigurationSection()
        {
            UsaStateDefinitionConfigurationSection returnSection = (UsaStateDefinitionConfigurationSection)ConfigurationManager.GetSection(ConfigurationSectionName);
            if (returnSection != null)
            {
                var duplicates = returnSection.IUsaStateDefinitions.GroupBy(i => new { i.UsaStateDefinitionUniqueIdentifier })
                  .Where(g => g.Count() > 1)
                  .Select(g => g.Key);

                if (duplicates.Count() > 1)
                {
                    throw new ArgumentOutOfRangeException(\"Duplicate UsaStateDefinitionUniqueIdentifier values.\",Convert.ToString(duplicates.First().UsaStateDefinitionUniqueIdentifier));
                }

                return returnSection;
            }

            return null;
        }
    }
}


/**/




// file=\"UsaStateDefinitionConfigurationSection.cs\"




using System.Configuration;

using GranadaCoder.CustomConfigurationExample.Configuration.Interfaces;

namespace GranadaCoder.CustomConfigurationExample.Configuration
{
    public class UsaStateDefinitionConfigurationSection : ConfigurationSection,IUsaStateDefinitionConfigurationSection
    {
        [ConfigurationProperty(\"\",IsDefaultCollection = true)]
        public UsaStateDefinitionCollection UsaStateDefinitions
        {
            get
            {
                UsaStateDefinitionCollection coll = (UsaStateDefinitionCollection)base[string.Empty];
                return coll;
            }
        }

        /* Here is the interface property that simply returns the non-interface property from above.  This allows System.Configuration to hydrate the non-interface property,but allows the code to be written (and unit test mocks to be written) against the interface property. */
        public IUsaStateDefinitionCollection IUsaStateDefinitions
        {
            get { return this.UsaStateDefinitions; }
        }
    }
}



/**/




// file=\"UsaStateDefinitionFinder.cs\"




using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;

using GranadaCoder.CustomConfigurationExample.Configuration.Interfaces;

namespace GranadaCoder.CustomConfigurationExample.Configuration
{
    public class UsaStateDefinitionFinder : IUsaStateDefinitionFinder
    {
        private const string ErrorMessageMoreThanOneMatch = \"More than item was found with the selection criteria. ({0})\";

        private const string ErrorMessageNoMatch = \"No item was found with the selection criteria. ({0})\";

        public UsaStateDefinitionConfigurationElement FindUsaStateDefinitionConfigurationElement(IUsaStateDefinitionConfigurationSection settings,string usaStateFullName)
        {
            UsaStateDefinitionConfigurationElement returnItem = null;

            if (null != settings && null != settings.IUsaStateDefinitions)
            {
                ICollection<UsaStateDefinitionConfigurationElement> matchingFarmItems;
                matchingFarmItems = settings.IUsaStateDefinitions.Where(ele => usaStateFullName.Equals(ele.UsaStateFullName,StringComparison.OrdinalIgnoreCase)).ToList();

                if (matchingFarmItems.Count > 1)
                {
                    string errorDetails = this.BuildErrorDetails(matchingFarmItems);
                    throw new IndexOutOfRangeException(string.Format(ErrorMessageMoreThanOneMatch,errorDetails));
                }

                returnItem = matchingFarmItems.FirstOrDefault();
            }

            return returnItem;
        }

        public UsaStateDefinitionConfigurationElement FindUsaStateDefinitionConfigurationElement(string usaStateFullName)
        {
            IUsaStateDefinitionConfigurationSection settings = new UsaStateDefinitionConfigurationRetriever().GetIUsaStateDefinitionConfigurationSection();
            return this.FindUsaStateDefinitionConfigurationElement(settings,usaStateFullName);
        }

        public UsaStateDefinitionConfigurationElement FindUsaStateDefinitionConfigurationElementByUniqueId(int id)
        {
            IUsaStateDefinitionConfigurationSection settings = new UsaStateDefinitionConfigurationRetriever().GetIUsaStateDefinitionConfigurationSection();
            return this.FindUsaStateDefinitionConfigurationElementByUniqueId(settings,id);
        }

        public UsaStateDefinitionConfigurationElement FindUsaStateDefinitionConfigurationElementByUniqueId(IUsaStateDefinitionConfigurationSection settings,int id)
        {
            UsaStateDefinitionConfigurationElement returnItem = null;

            if (null != settings && null != settings.IUsaStateDefinitions)
            {
                ICollection<UsaStateDefinitionConfigurationElement> matchingFarmItems;
                matchingFarmItems = settings.IUsaStateDefinitions.Where(ele => id == ele.UsaStateDefinitionUniqueIdentifier).ToList();

                if (matchingFarmItems.Count > 1)
                {
                    string errorDetails = this.BuildErrorDetails(matchingFarmItems);
                    throw new IndexOutOfRangeException(string.Format(ErrorMessageMoreThanOneMatch,errorDetails));
                }

                returnItem = matchingFarmItems.FirstOrDefault();
            }

            return returnItem;
        }

        private string BuildErrorDetails(ICollection<UsaStateDefinitionConfigurationElement> items)
        {
            string returnValue;

            StringBuilder sb = new StringBuilder();

            if (null != items)
            {
                foreach (UsaStateDefinitionConfigurationElement item in items)
                {
                    sb.Append(string.Format(\"UsaStateFullName=\'{0}\'.\",item.UsaStateFullName));
                }
            }

            returnValue = sb.ToString();

            return returnValue;
        }
    }
}



/**/




// file=\"IUsaStateDefinitionCollection.cs\"




using System;
using System.Collections.Generic;

namespace GranadaCoder.CustomConfigurationExample.Configuration.Interfaces
{
    public interface IUsaStateDefinitionCollection : IList<UsaStateDefinitionConfigurationElement>,IEnumerable<UsaStateDefinitionConfigurationElement> /* Implement IEnumerable to allow Linq queries */
    {
        UsaStateDefinitionConfigurationElement this[string name] { get; }

        void Remove(string name);
    }
}



/**/




// file=\"IUsaStateDefinitionConfigurationSection.cs\"




using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace GranadaCoder.CustomConfigurationExample.Configuration.Interfaces
{
    public interface IUsaStateDefinitionConfigurationSection
    {
        IUsaStateDefinitionCollection IUsaStateDefinitions { get; }
    }
}


/**/




// file=\"IUsaStateDefinitionConfigurationSectionRetriever.cs\"




namespace GranadaCoder.CustomConfigurationExample.Configuration.Interfaces
{
    public interface IUsaStateDefinitionConfigurationSectionRetriever
    {
        IUsaStateDefinitionConfigurationSection GetIUsaStateDefinitionConfigurationSection();
    }
}



/**/




// file=\"IUsaStateDefinitionFinder.cs\"




using System;

namespace GranadaCoder.CustomConfigurationExample.Configuration.Interfaces
{
    public interface IUsaStateDefinitionFinder
    {
        UsaStateDefinitionConfigurationElement FindUsaStateDefinitionConfigurationElement(IUsaStateDefinitionConfigurationSection settings,string usaStateFullName);

        UsaStateDefinitionConfigurationElement FindUsaStateDefinitionConfigurationElement(string usaStateFullName);

        UsaStateDefinitionConfigurationElement FindUsaStateDefinitionConfigurationElementByUniqueId(int id);

        UsaStateDefinitionConfigurationElement FindUsaStateDefinitionConfigurationElementByUniqueId(IUsaStateDefinitionConfigurationSection settings,int id);
  }
}



/**/




// file=\"Program.cs\"

using System;
using System.Text;

using GranadaCoder.CustomConfigurationExample.Configuration;
using GranadaCoder.CustomConfigurationExample.Configuration.Interfaces;

using log4net;
using Microsoft.Practices.Unity;

namespace GranadaCoder.CustomConfigurationExample.ConsoleAppOne
{
    public static class Program
    {
        public const int UnhandledExceptionErrorCode = 1;

        private static readonly ILog TheLogger = LogManager.GetLogger(typeof(Program));

        public static int Main(string[] args)
        {
            int returnValue = 0;
            string logMsg = string.Empty;

            try
            {
                //// For future //log4net.Config.XmlConfigurator.Configure();
                //// For future //IUnityContainer container = new UnityContainer();
                //// For future //container.RegisterType<ILog>(new InjectionFactory(x => LogManager.GetLogger(typeof(GranadaCoder.CustomConfigurationExample.ConsoleAppOne.Program))));

                IUsaStateDefinitionConfigurationSectionRetriever retr = new UsaStateDefinitionConfigurationRetriever();
                IUsaStateDefinitionConfigurationSection section = retr.GetIUsaStateDefinitionConfigurationSection();

                IUsaStateDefinitionFinder finder = new UsaStateDefinitionFinder();
                UsaStateDefinitionConfigurationElement foundElement = finder.FindUsaStateDefinitionConfigurationElement(\"Virginia\");

                if (null != section)
                {
                    foreach (UsaStateDefinitionConfigurationElement state in section.IUsaStateDefinitions)
                    {
                        Console.WriteLine(\"state.UsaStateFullName=\'{0}\',state.UsaStateAbbreviation=\'{1}\',state.IsContenential=\'{2}\',state.CountyLabelType=\'{3}\'\",state.UsaStateFullName,state.UsaStateAbbreviation,state.IsContenential,state.CountyLabelType);
                        foreach (UsaCountyConfigurationElement county in state.UsaCounties)
                        {
                            Console.WriteLine(\"county.UsaCountyValue=\'{0}\'\",county.UsaCountyValue);
                        }

                        Console.WriteLine(\"--------------------\");
                    }
                }
            }
            catch (Exception e)
            {
                TheLogger.Error(e.Message,e);
                Console.WriteLine(\"Unexpected Exception : {0}\",e.Message);
                returnValue = UnhandledExceptionErrorCode;
            }

            Console.WriteLine(\"END : {0}\",System.Diagnostics.Process.GetCurrentProcess().ProcessName);
            Console.WriteLine(string.Empty);

            Console.WriteLine(\"Press ENTER to exit\");
            Console.ReadLine();

            return returnValue;
        }
    }
}
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-