如何将 Properties 或 .Settings 传递给函数?

How do I pass Properties or .Settings to a function?

我目前正在使用 .Settings 文件在 WinForms 应用程序中存储关卡数据(Level1.settings、Level2.settings)。请不要介意我为什么要那样做 :) 我目前正在阅读具有不同函数的每个级别,因为我不知道如何传递给函数。

在我的申请中我有:

AppTitle
  Properties
    Level1.settings
    Level2.settings

我目前正在使用不同的功能阅读它们,例如:

void readLevel1() 
{ 
   levelMessage = Properties.Level1.Default.WelcomeMessage; 
}

在此示例中,如何将 "Level1" 作为参数传递给函数?

我更喜欢这样的东西:

void readLevel(String identifier)
{
  levelMessage = ConfigurationManager.AppSettings[identifier].Default.WelcomeMessage;
}

但我在 "Default" 上收到语法错误说,'字符串不包含 'Default' 的定义并且不包含接受字符串第一个参数的扩展方法 'Default'成立'。任何帮助将不胜感激!

新信息: 好吧,我一整天都在用头撞墙,这就是我想出的,这似乎有效:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ConfigurationSection cs = config.SectionGroups["applicationSettings"].Sections["AppTitle.Properties.Level1"];
ClientSettingsSection css = (ClientSettingsSection)cs;
String s = css.Settings.Get("WelcomeMessage").Value.ValueXml.InnerText;

如果有人知道更好的方法请告诉我!使用 InnerText 感觉就像一个黑客。

感谢 Ann 的帮助!

我将假设 Level1Level2 具有所有相同的属性和所有相同的定义。

在这种情况下,您可以创建一个 Level1Level2 都可以实现的接口。然后你可以像这样定义你的设置读取方法:

void ReadLevel(ILevelSettings settingsInstance)
{
   levelMessage = settingsInstance.WelcomeMessage;
}

你可以这样称呼它:

ReadLevel(Properties.Level1.Default);

如果为 Level1Level2 生成的 classes 是部分 classes(我不记得它们是否是)这应该很容易实施。

预计到达时间:部分class演示:

class 定义中的 partial 关键字意味着 class 的定义不一定都在一个源代码文件中。你可以有其他人。

因此您可以创建自己的源代码文件,将其命名为 "Level1.partial.cs",并使用此代码:

 namespace AppTitle.Properties
 {
     internal sealed partial class Level1 : ILevelSettings
     {
         // any additional functions or properties that you would like
         // your Level1 class to have.
     }
 }

(免责声明:那是凭记忆。我省略了 using 语句。)

在编译时,编译器会收集所有 class Level1 具有相同命名空间和修改关键字(internal,sealed)的定义,并将它们构建成一个单一的 class,将生成的方法和属性与您添加的任何方法和属性混合。

因此,您可以使生成的 Level1Level2 classes 继承自接口(甚至是基础 class),即使大多数 class 生成了定义。您可以随时重新生成它而不会影响您添加的代码,因为它在不同的文件中。