One Step Ahead

プログラミングやエンジニアリング全般について書いていきます

App.config "appSettings"から値を取得する - .NET Framework編 -

はじめに


Projectを起こす度にほぼ必ずと言っていいほど使うApp.configから値を取得するというパターン。
だけど、これを使うのってホントに立ち上げ当初だけだから、毎回忘れて、毎回調べての繰り返し...頭悪くてごめんなさい。

忘れないようによく使うパターンも合わせて記載しておきます。
(ちなにみ.NET Coreだと取得方法が違うので、それもどこかで。)

実行環境


  • .NET Framework 4.7.2
  • Visual Studio 2017

App.configの<appSetting>タグから値を取得


App.configはこんな感じ。今回対象になるのは、配下に存在する<add>タグの”value"。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup> 
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
  </startup>
  <appSettings>
    <add key="hoge" value="huga" />
  </appSettings>
</configuration>

まずは System.Configuration が必要になるが、ただ単純に参照するだけだと「ConfigurationManager」に辿りつけない。
(私の環境だけじゃないよね...職場のPCも同じだからきっと皆さん同じはず。)

usingディレクティブにSystem.Configuraiton;を追加しても、Intellisenseでは補完されず、参照することもできないので、参照を追加する。

f:id:EaE:20190508005953p:plain

参照 -> 参照の追加(R) -> アセンブリ ->System.Configurationを追加してあげる。
これで、ConfigurationManagerが参照できるようになる。

using System.Configuration;

namespace sample
{
    static class sample
    {
        public static void Main()
        {
            var addValue = ConfigurationManager.AppSettings["key"];
        } 
    }
}

”key"の部分に取得したいvalueのキー値を設定することで<add>タグのvalue値を取得することができる。

わたしてき利用方法

上述のコードでも結構シンプルなので、このまま使っても良いには良いと思う。
ただ、この場合は返却される値がString型なので、値によっては都度Parse処理を書く必要があるのでめんどくさい。
加えて、設定ファイルから取得する値は参照箇所が広範囲に及ぶことが多いので、もしキー値が変更になったりすると割と泣ける。

using System.Configuration;

namespace sample.util
{
    /// <summary>
    /// App.config操作用Utilityクラス
    /// </summary>
    public static class AppConfigUtil
    {
        ///<summary>
        /// リトライ回数
        ///</summary>
        public static int RetryCnt { get { return int.Parse(getAppSetting("key")) }}

        /// <summary>
        /// 型指定に応じて値を返却します.
        ///  ※指定型が存在しない場合、NotSupportExceptionをThrowします.
        /// </summary>
        /// <typeparam name="T">変換型指定</typeparam>
        /// <param name="key">キー値</param>
        /// <returns>返還後値</returns>
        public static T GetValue<T>(string key)
        {
            if (typeof(T) == typeof(bool))
            {
                return (T)(object)bool.Parse(getAppSetting(key));
            }

            if (typeof(T) == typeof(int))
            {
                return (T)(object)int.Parse(getAppSetting(key));
            }

            if (typeof(T) == typeof(double))
            {
                return (T)(object)double.Parse(getAppSetting(key));
            }

            throw new NotSupportedException(typeof(T).Name);
        }
  
        /// <summary>
        /// appSettingsに存在するaddタグの中から引数に該当するKey値をもつ値を取得します.
        /// </summary>
        /// <param name="key">キー値</param>
        /// <returns>キーに紐づく値</returns>
        private static string getAppSetting(string key)
        {
            return ConfigurationManager.AppSettings[key];
        }
    }
}

まずはstaticなプロパティを定義して、読み取り専用で呼び出すパターン。 今はint.Parseで書いてしまっていますが、基本的には設定ファイルを手作業で修正することが多いので、 Try.Parseの方がよいかなと思います。

後は、汎用的にジェネリクスを使ってGetメソッドを定義してしまうことも良くやっている気がします。