AppSettingsとConnectionStringsはどちらも、ConfigurationManagerで直接使用できるプロパティです。
ただし、VS設定デザイナで編集できる 使い慣れた Settings.settingsに対応するapplicationSettingsとuserSettingsは、簡単に取得することはできません。AppSettingsは、使用中の構成ファイルのまったく異なるセクションにあるapplicationSettingsと同じではありません。
applicationSettingsとuserSettingsを取得するには、上記のマイニングアプローチまたはバリアントを使用する必要があります。また、applicationSettingsは、実行時にまったく書き込みができない場合にのみ、アプリケーションを次に起動したときに更新されます。
例(他の場所からの引用-ありがとう):
public static string ReadSetting(string sectionGroupName, string sectionName, string settingName, Configuration config = null)
{
if (config == null)
config = SharedConfigSettings;
// Get sectionGroup
var sectionGroup =
config.GetSectionGroup(sectionGroupName);
// Get section
var section =
(ClientSettingsSection)sectionGroup.Sections.Get(sectionName);
// Get setting
var setting = section.Settings.Get(settingName);
// Read setting value
return setting.Value.ValueXml.InnerText;
}
そして別の例(多くの例から引用-世界に感謝します):
///<summary>
/// return the applicationSettings section
///</summary>
///<returns></returns>
public static ClientSettingsSection GetSettingsSection(ConfigurationSectionGroup group, string clientSectionName)
{
return (ClientSettingsSection)group.Sections[clientSectionName];
}
///<summary>
/// return the section settings collection
///</summary>
///<returns></returns>
public static System.Configuration.SettingElementCollection GetSettingsCollection(ClientSettingsSection section)
{
return section.Settings;
}
///<summary>
/// return the connectionStrings section collection
///</summary>
///<returns></returns>
public static System.Configuration.SettingElementCollection ConnectionStringsCollection()
{
return ((ClientSettingsSection)SharedConfigSettings.GetSection("connectionStrings")).Settings;
}
///<summary>
/// A collection of all the UserSettings in a SettingElementCollection
///</summary>
///<returns></returns>
public static SettingElementCollection UserSettings()
{
return
GetSettingsCollection(GetSettingsSection(GetSettingsSectionGroup(@"userSettings"),
@"MyAssembly.Properties.Settings"));
}
///<summary>
/// A collection of all the ApplicationSettings in a SettingElementCollection
///</summary>
///<returns></returns>
public static SettingElementCollection ApplicationSettings()
{
return
GetSettingsCollection(GetSettingsSection(GetSettingsSectionGroup(@"applicationSettings"),
@"MyAssembly.Properties.Settings"));
}
次に、残念ながら、これらのセクションの設定コレクションにあるSettingElementオブジェクトを処理する必要があります。たとえば、applicationSettings SettingElement(実行時に動的に更新できないもの)の文字列でない限り、それぞれをプロパティTypeに逆シリアル化する必要があります。
(エクササイズ)
var y = GetSettingsSection(GetSettingsSectionGroup(@"applicationSettings"), @"MyAssembly.Properties.Settings");
var c = (y.Settings.Cast<SettingElement>().FirstOrDefault(s => s.Name == "WellKnownDirectories").Value).ValueXml
.InnerXml; // the setting as Xml
var xs = new XmlSerializer(typeof(string[]));
var strings = (string[])xs.Deserialize(new XmlTextReader(c, XmlNodeType.Element, null));
foreach (string s in strings)
{
Console.WriteLine(s);
}
文字列プロパティの場合は簡単です(この例は、上記の最初の例と本質的に冗長です)。
var s = (y.Settings.Cast<SettingElement>().FirstOrDefault(s => s.Name == "MyUserSettingName").Value).ValueXml
.InnerText
これらの例はすべて、applicationSettingsをいじっています。同じアプローチでuserSettingsを使用できますが、おそらくいくつかの保存メソッドなどが追加されます。メイン、ローミング、ローカルなど、いくつかの多くの構成ファイルのどれが実際に再生されているかを(多かれ少なかれ)追跡する必要があります。 。
なぜ私はこれをしているのですか?2つの関連するアプリケーションと共通のクラスライブラリ(または複数のライブラリ)はすべて、設定が視覚的に管理されているアプリケーションの1つが所有する同じ設定を使用する必要があるためです。誰かがこれをより良い方法で解決しましたか?
ありがとう。