zoukankan      html  css  js  c++  java
  • 封装读取配置文件类

    AppSettings.cs

    public static class AppSettings
        {
    
            public static T GetSettingByKey<T>(string key, T defaultValue = default(T))
            {
                key = key.Trim().ToLowerInvariant();
                var settings = GetAllSettings();
                if (settings.ContainsKey(key))
                    return CommonHelper.To<T>(settings[key].Value);
    
                return defaultValue;
            }
    
            public static TSettings GetSetting<TSettings>()
            {
                var Settings = Activator.CreateInstance<TSettings>();
    
                // get properties we can write to
                var properties = from prop in typeof(TSettings).GetProperties()
                                 where prop.CanWrite && prop.CanRead
                                 let setting = AppSettings.GetSettingByKey<string>(typeof(TSettings).Name + "." + prop.Name)
                                 where setting != null
                                 where CommonHelper.GetNopCustomTypeConverter(prop.PropertyType).CanConvertFrom(typeof(string))
                                 where CommonHelper.GetNopCustomTypeConverter(prop.PropertyType).IsValid(setting)
                                 let value = CommonHelper.GetNopCustomTypeConverter(prop.PropertyType).ConvertFromInvariantString(setting)
                                 select new { prop, value };
    
                // assign properties
                properties.ToList().ForEach(p => p.prop.SetValue(Settings, p.value, null));
                return Settings;
            }
    
            public static IDictionary<string, KeyValuePair<int, string>> GetAllSettings()
            {
                var settings = new Dictionary<string, KeyValuePair<int, string>>();
                var appSettings = ConfigurationManager.AppSettings;
                foreach (var setting in appSettings.AllKeys)
                {
                    settings.Add(setting.ToLowerInvariant(), new KeyValuePair<int, string>(0, appSettings[setting]));
                }
    
                return settings;
            }
        }

    CommonHelper.cs

    /// <summary>
        /// Represents a common helper
        /// </summary>
        public partial class CommonHelper
        {
            
            /// <summary>
            /// Converts a value to a destination type.
            /// </summary>
            /// <param name="value">The value to convert.</param>
            /// <param name="destinationType">The type to convert the value to.</param>
            /// <returns>The converted value.</returns>
            public static object To(object value, Type destinationType)
            {
                return To(value, destinationType, CultureInfo.InvariantCulture);
            }
    
            /// <summary>
            /// Converts a value to a destination type.
            /// </summary>
            /// <param name="value">The value to convert.</param>
            /// <param name="destinationType">The type to convert the value to.</param>
            /// <param name="culture">Culture</param>
            /// <returns>The converted value.</returns>
            public static object To(object value, Type destinationType, CultureInfo culture)
            {
                if (value != null)
                {
                    var sourceType = value.GetType();
    
                    TypeConverter destinationConverter = GetNopCustomTypeConverter(destinationType);
                    TypeConverter sourceConverter = GetNopCustomTypeConverter(sourceType);
                    if (destinationConverter != null && destinationConverter.CanConvertFrom(value.GetType()))
                        return destinationConverter.ConvertFrom(null, culture, value);
                    if (sourceConverter != null && sourceConverter.CanConvertTo(destinationType))
                        return sourceConverter.ConvertTo(null, culture, value, destinationType);
                    if (destinationType.IsEnum && value is int)
                        return Enum.ToObject(destinationType, (int)value);
                    if (!destinationType.IsAssignableFrom(value.GetType()))
                        return Convert.ChangeType(value, destinationType, culture);
                }
                return value;
            }
    
            /// <summary>
            /// Converts a value to a destination type.
            /// </summary>
            /// <param name="value">The value to convert.</param>
            /// <typeparam name="T">The type to convert the value to.</typeparam>
            /// <returns>The converted value.</returns>
            public static T To<T>(object value)
            {
                //return (T)Convert.ChangeType(value, typeof(T), CultureInfo.InvariantCulture);
                return (T)To(value, typeof(T));
            }
    
            public static TypeConverter GetNopCustomTypeConverter(Type type)
            {
                /*if (type == typeof(List<int>))
                    return new GenericListTypeConverter<int>();*/
                return TypeDescriptor.GetConverter(type);
            }
    
        }

    App.config

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <appSettings>
        <add key="Setting1" value="SomeValue"/>
        <add key="Setting2" value="25"/>
        <add key="Setting3" value="12/25/2010"/>
    
        <add key="TestSettings.ServerName" value="Ruby"/>
        <add key="TestSettings.Ip" value="192.168.0.1"/>
        <add key="TestSettings.PortNumber" value="21"/>
        <add key="TestSettings.Username" value="admin"/>
        <add key="TestSettings.Password" value="password"/>
      </appSettings>
    </configuration>

    UnitTest1.cs

    [TestMethod]
            public void Can_get_all_settings()
            {
                var settings = AppSettings.GetAllSettings();
                Assert.IsNotNull(settings);
                Assert.IsTrue(settings.Count > 0);
            }
    
            [TestMethod]
            public void Can_get_setting_by_key()
            {
                var setting = AppSettings.GetSettingByKey<string>("Setting1");
                Assert.AreEqual(setting, "SomeValue");
            }
    
            [TestMethod]
            public void Can_get_typed_setting_value_by_key()
            {
                var setting = AppSettings.GetSettingByKey<DateTime>("Setting3");
                Assert.AreEqual(setting, new DateTime(2010, 12, 25));
            }
    
            [TestMethod]
            public void Default_value_returned_if_setting_does_not_exist()
            {
                var setting = AppSettings.GetSettingByKey<int>("NonExistentKey", 100);
                Assert.AreEqual(setting, 100);
            }
    
            [TestMethod]
            public void Can_get_settings()
            {
                // requires settings to be set in app.config in format TestSettings.[PropertyName]
                var settings = AppSettings.GetSetting<TestSettings>();
                settings.ServerName.ShouldEqual("Ruby");
                settings.Ip.ShouldEqual("192.168.0.1");
                settings.PortNumber.ShouldEqual(21);
                settings.Username.ShouldEqual("admin");
                settings.Password.ShouldEqual("password");
            }

    学习nop中读取配置文件的方式。读取方法改成了静态方法。提取出来单独使用。

  • 相关阅读:
    PAT顶级 1015 Letter-moving Game (35分)
    PAT顶级 1008 Airline Routes (35分)(有向图的强连通分量)
    PAT顶级 1025 Keep at Most 100 Characters (35分)
    PAT顶级 1027 Larry and Inversions (35分)(树状数组)
    PAT 顶级 1026 String of Colorful Beads (35分)(尺取法)
    PAT顶级 1009 Triple Inversions (35分)(树状数组)
    Codeforces 1283F DIY Garland
    Codeforces Round #438 A. Bark to Unlock
    Codeforces Round #437 E. Buy Low Sell High
    Codeforces Round #437 C. Ordering Pizza
  • 原文地址:https://www.cnblogs.com/miku/p/2696133.html
Copyright © 2011-2022 走看看