using System; using System.Collections.Generic; using System.Text; using System.Configuration; using System.ComponentModel; using Configuration.Configuration.Common; namespace Configuration.Configuration { /// <summary> /// DataBaseConfig节点 /// </summary> public class DataBaseConfigure:ConfigurationSection { public DataBaseConfigure() { } [ConfigurationProperty("DefaultConnectionString")] public string DefaultConnectionString { get { return (string)this["DefaultConnectionString"]; } set { this["DefaultConnectionString"] = value; } } /// <summary> /// 子节点 /// </summary> [ConfigurationProperty("ConnectionStrings", IsRequired = true)] public ConnectionStrings ConnectionStrings { get { return (ConnectionStrings)this["ConnectionStrings"]; } set { this["ConnectionStrings"] = value; } } public override string ToString() { return string.Format("DefaultConnectionString:{0}", this.DefaultConnectionString); } } /// <summary> /// ConnectionString子节点(允许单个节点) /// </summary> public class ConnectionString : ConfigurationElement { public ConnectionString() { } public ConnectionString(string name) { Name =name; } [ConfigurationProperty("ConnectionString", IsRequired = true)] public string ConnectingString { get { return (string)this["ConnectionString"]; } set { this["ConnectionString"] = value; } } [ConfigurationProperty("name",IsRequired=true,IsKey=true)] public string Name { get { return (string)this["name"]; } set { this["name"] = value; } } [ConfigurationProperty("Provider", IsRequired = true)] [TypeConverter(typeof(AssemblyQualifiedTypeNameConverter))] public Type ConnectingProvider { get { return (Type)this["Provider"]; } set { this["Provider"] = value; } } } /// <summary> /// ConnectionString子节点(允许多个节点) /// </summary> public class ConnectionStrings : ConfigurationElementCollection { public ConnectionStrings() { } protected override ConfigurationElement CreateNewElement() { return new ConnectionString(); } protected override ConfigurationElement CreateNewElement(string elementName) { return new ConnectionString(elementName); } protected override object GetElementKey(ConfigurationElement element) { return ((ConnectionString)element).Name; } public ConnectionString this[int index] { get { return (ConnectionString)BaseGet(index); } set { if (BaseGet(index) != null) { BaseRemoveAt(index); } BaseAdd(index, value); } } public int IndexOf(ConnectionString con) { return BaseIndexOf(con); } new public ConnectionString this[string name] { get { return (ConnectionString)BaseGet(name); } } public override ConfigurationElementCollectionType CollectionType { get { return ConfigurationElementCollectionType.AddRemoveClearMap; } } #region 添加/移除/清除节点 public new string AddElementName { get { return base.AddElementName; } set { base.AddElementName = value; } } public void Add(ConnectionString con) { BaseAdd(con); } protected override void BaseAdd(ConfigurationElement element) { BaseAdd(element, false); } public void Remove(ConnectionString con) { if (BaseIndexOf(con) >= 0) BaseRemove(con.Name); } public void Remove(string name) { BaseRemove(name); } public void RemoveAt(int index) { BaseRemoveAt(index); } public new string RemoveElementName { get { return base.RemoveElementName; } } public new string ClearElementName { get { return base.ClearElementName; } set { base.AddElementName = value; } } public void Clear() { BaseClear(); } #endregion #region 集合数量 public new int Count { get { return base.Count; } } #endregion } }
处理Type转换的类
using System; using System.Collections.Generic; using System.Text; using System.Configuration; using System.ComponentModel; using Configuration.Properties; namespace Configuration.Configuration.Common ...{ publicclass AssemblyQualifiedTypeNameConverter : ConfigurationConverterBase ...{ /**////<summary> /// Returns the assembly qualified name for the passed in Type. ///</summary> ///<param name="context">The container representing this System.ComponentModel.TypeDescriptor.</param> ///<param name="culture">Culture info for assembly</param> ///<param name="value">Value to convert.</param> ///<param name="destinationType">Type to convert to.</param> ///<returns>Assembly Qualified Name as a string</returns> publicoverrideobject ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) ...{ Type typeValue = value as Type; if (typeValue ==null) ...{ thrownew Exception("参数错误"); } if (typeValue !=null) return (typeValue).AssemblyQualifiedName; returnnull; } /**////<summary> /// Returns a type based on the assembly qualified name passed in as data. ///</summary> ///<param name="context">The container representing this System.ComponentModel.TypeDescriptor.</param> ///<param name="culture">Culture info for assembly.</param> ///<param name="value">Data to convert.</param> ///<returns>Type of the data</returns> publicoverrideobject ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) ...{ string stringValue = (string)value; Type result = Type.GetType(stringValue, false); if (result ==null) ...{ thrownew Exception("参数错误"); } return result; } } }
配置中用到的两个类和代码中用到的一个接口
interface ConnectingProvider ...{ string GetDB(); } class OleDBConnectingProvider:ConnectingProvider ...{ ConnectingProvider Members#region ConnectingProvider Members publicstring GetDB() ...{ return"this is OleDBConnecting"; } #endregion } class SqlConnectingProvider : ConnectingProvider ...{ ConnectingProvider Members#region ConnectingProvider Members publicstring GetDB() ...{ return"this is SqlConnecting"; } #endregion }