アプリケーションを作っていると、オプションだったり、初期値だったりを外部ファイルに外出ししたい場合があると思います。
C#ではアプリケーションプロジェクトを作成するとデフォルトでApp.configファイルが作成されるため、今回はApp.configファイルからデータを取得するクラスを紹介します。
設定情報の取得方法
System.Configration.ConfigurationManager
App.configからデータを取得する機能自体はSystem.Configration名前空間として提供されています。
プロジェクトの参照にSystem.Configrationを追加することで使用できます。
System.Configration.ConfigurationManagerクラスの静的メソッドを使用して設定情報を取得する方法を以下に示します。
App.config
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?xml version="1.0" encoding="utf-8"?> <configuration> <connectionStrings> <add name="DB" connectionString="Data Source=test.db;"/> </connectionStrings> <appSettings> <add key="AppName" value="TestApplication"/> <add key="Date" value="2022/06/27"/> <add key="IntValue" value="99999999"/> </appSettings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/> </startup> </configuration> |
使用方法
1 2 3 |
ConfigurationManager.AppSettings["AppName"]; // "TestApplication" ConfigurationManager.AppSettings["Date"]; // "2022/06/27" ConfigurationManager.AppSettings["IntValue"]; // "99999999" |
結果の通り、設定情報を取得出来ました。
が、すべて文字列として取得されます。
実際に使用する場合はキャストする必要がありますが、いちいち個別にキャストするのは面倒なので型を指定して値を取得出来るようにした汎用クラスを定義します。
型を指定して値を取得する
System.Configration.ConfigurationManagerのラッパークラスを作成します。
ConfigUtil.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
/// <summary> /// アプリケーション設定ファイル操作に関する静的関数を提供します。 /// </summary> public static class ConfigUtil { /// <summary> /// 設定ファイルからDB接続文字列を取得します。 /// </summary> /// <param name="name">名称</param> /// <returns>DB接続文字列</returns> public static string GetConnectionString(string name) { foreach (ConnectionStringSettings setting in ConfigurationManager.ConnectionStrings) { if (setting.Name == name) return setting.ConnectionString; } return string.Empty; } /// <summary> /// 設定ファイルから指定した型のデータを取得します。 /// 取得できなかった場合、デフォルト値を返却します。 /// </summary> /// <typeparam name="T">データ型</typeparam> /// <param name="name">名称</param> /// <param name="def">デフォルト値</param> /// <returns>データ</returns> public static T GetAppSetting<T>(string name, T def = default) { if (!HasAppSetting(name)) return def; try { return (T)Convert.ChangeType(ConfigurationManager.AppSettings[name], typeof(T)); } catch (Exception) { return def; } } /// <summary> /// 指定した名称のデータが設定ファイルに存在するか判定します。 /// </summary> /// <param name="name">名称</param> /// <returns>存在する/存在しない</returns> public static bool HasAppSetting(string name) { if (!ConfigurationManager.AppSettings.HasKeys()) return false; if (ConfigurationManager.AppSettings[name] is null) return false; return true; } } |
使用方法
1 2 3 4 5 |
ConfigUtil.GetAppSetting<string>("AppName"); // "TestApplication" ConfigUtil.GetAppSetting<string>("Foo", "Buz"); // "Buz" ConfigUtil.GetAppSetting<DateTime>("Date"); // 2022/06/27(DateTimeオブジェクト) ConfigUtil.GetAppSetting<int>("IntValue"); // 99999999 ConfigUtil.GetAppSetting<double>("DoubleValue", 99999999.9999); // 99999999.9999 |
第1引数に設定情報のキー名、第2引数にデフォルト値を指定します。
第2引数は指定しない場合は型のデフォルト値になります。(参照型はnull, 数値型は0)
おまけ
DB接続文字列の取得と設定ファイルにキーが存在するかどうかを判定する方法を記載します。
1 2 3 |
ConfigUtil.GetConnectionString("DB"); // "Data Source=test.db;" ConfigUtil.HasAppSetting("Date"); // true ConfigUtil.HasAppSetting("Foo"); // false |
接続文字列にDBのユーザー名、パスワードが含まれる場合は注意してください。
まとめ
型とデフォルト値を指定出来るため、System.Configration.ConfigurationManagerをそのまま使用するよりは使い勝手がいいと思います。
プロジェクトのリソースファイルに設定情報を埋め込む方法もありますが、自分はあまり使用していません。
App.configだと手軽に設定値を変更出来るのが便利でこちらをよく使用しています。
ただし、ユーザーに変更されてはまずい値はApp.configには定義しないように気を付けましょう。
コメント