読者です 読者をやめる 読者になる 読者になる

ふるすたっくえんじにあっぽい人の日記

ASP .NET MVC (C#)、.NET Framework、iOS (Objective-c) アプリ、Androidアプリ (Java)、AWS、たまにLAMPとかプロジェクトマネジメントあたりのお話

【C#】Web.configから設定値を取得する

はーい、今日も晒していきますよー

iOSのブログのほうが流入多いんですけどねー
めげずにC#書きますよー

ASP .NET Webアプリケーションだと、Web.configをDebug/Relaseで切り替えて設定を保持しますねー
ここらへんはググれば出てくるで割愛ー
で、Web.configの書き方

Web.config

<?xml version="1.0"?>
<configuration>
<!-- 省略 -->
  <appSettings>
<!-- 省略 -->
    <add key="BuildMode" value="Debug"/>
  </appSettings>
<!-- 省略 -->
</configuration>

はい、省略しすぎですねー
参考までに私はkeyにnamespace入れたりしますねー
key="Hoge.Hoge.Hoge.BuildMode"見たいな感じですねー
まぁでかいもの作らなきゃ不要かとー

んで、Web.configから値取るために.NETにSystem.Configuration.ConfigurationManagerとゆークラスがいるわけです。こんな感じで使いますねー

var buildMode = ConfigurationManager.AppSettings["BuildMode"];

buildModeには"Debug"が入ってますねー
が、しかし。
AppSettingsはNameValueCollection型なのでstirng型でしか取得できない!
いちいち毎回parseすんのかこのやろう?というわけで作ったラッパーが以下
たぶん作ったときだるい気分だったんでしょうねw
手抜きでtry~catchにしてますが、本来はTryParseを用いるべきかとw

    /// <summary>
    /// System.Core.Configuration.AppSettingsのラッパークラス
    /// </summary>
    public abstract class AppSettingsWrapper
    {
        private static NameValueCollection _appSettings = ConfigurationManager.AppSettings;

        /// <summary>
        /// string型の設定値を取得します。
        /// </summary>
        /// <remarks>
        /// 指定されたキーが不正な場合、string.Emptyを返却します。
        /// </remarks>
        /// <param name="key">キー</param>
        /// <returns>string型の設定値</returns>
        protected static string GetSetting(string key)
        {
            return _appSettings[key];
        }

        /// <summary>
        /// int型の設定値を取得します。
        /// </summary>
        /// <remarks>
        /// 指定されたキーが不正な場合、0を返却します。
        /// </remarks>
        /// <param name="key">キー</param>
        /// <returns>int型の設定値</returns>
        protected static int GetIntSetting(string key)
        {
            try
            {
                return int.Parse(GetSetting(key));
            }
            catch
            {
                return 0;
            }
        }

        /// <summary>
        /// float型の設定値を取得します。
        /// </summary>
        /// <remarks>
        /// 指定されたキーが不正な場合、0を返却します。
        /// </remarks>
        /// <param name="key">キー</param>
        /// <returns>float型の設定値</returns>
        protected static float GetFloatSetting(string key)
        {
            try
            {
                return float.Parse(GetSetting(key));
            }
            catch
            {
                return 0;
            }
        }

        /// <summary>
        /// double型の設定値を取得します。
        /// </summary>
        /// <remarks>
        /// 指定されたキーが不正な場合、0を返却します。
        /// </remarks>
        /// <param name="key">キー</param>
        /// <returns>float型の設定値</returns>
        protected static double GetDoubleSetting(string key)
        {
            try
            {
                return double.Parse(GetSetting(key));
            }
            catch
            {
                return 0;
            }
        }

        /// <summary>
        /// bool型の設定値を取得します。
        /// </summary>
        /// <remarks>
        /// 指定されたキーが存在しない場合、falseを返却します。
        /// </remarks>
        /// <param name="key">キー</param>
        /// <returns>bool型の設定値</returns>
        protected static bool GetBoolSetting(string key)
        {
            try
            {
                return bool.Parse(GetSetting(key));
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// DateTime型の設定値を取得します。
        /// </summary>
        /// <remarks>
        /// 指定されたキーが存在しない場合、現在時刻を返却します。
        /// </remarks>
        /// <param name="key">キー</param>
        /// <returns>DateTime型の設定値</returns>
        protected static DateTime? GetDateTimeSetting(string key)
        {
            try
            {
                return DateTime.Parse(GetSetting(key));
            }
            catch
            {
                return DateTime.Now;
            }
        }

        /// <summary>
        /// TimeSpan型の設定値を取得します。
        /// </summary>
        /// <remarks>
        /// 指定されたキーが存在しない場合TimeSpan.Zeroを返却します。
        /// </remarks>
        /// <param name="key">キー</param>
        /// <returns>TimeSpan型の設定値</returns>
        protected static TimeSpan GetTimeSpanSetting(string key)
        {
            try
            {
                return TimeSpan.Parse(GetSetting(key));
            }
            catch
            {
                return TimeSpan.Zero;
            }
        }
    }

なぜ、abstractでprotectedメソッドしか用意してないかって?
継承して使うからですね。
外から勝手にkey指定して値取るとかまじ破綻するから絶対らめー
こんな感じで設定値公開用のクラスを用意して使いますー

public class HogeSettings : AppSettingsWrapper
    {
        public static string BuildMode { get { return GetSetting("BuildMode"); }          
    }

いじょー