9

我正在处理的 Web 应用程序中有一个包含客户端设置的类。对于某些背景,我不拥有这个类,并且改变它不是一种选择。我们最近添加了一些逻辑来将设置存储在数据库中,我的任务是创建一个页面来编辑它们,这很公平。

这是我的问题;这些设置保存在一个静态类中,它们本身就是静态的只读属性。例如

public static class Settings
{
 public static readonly setting1 = SettingmanagerClass.GetSetting("setting1");
 public static readonly setting2 = SettingmanagerClass.GetSetting("setting2");
 public static readonly setting3 = SettingmanagerClass.GetSetting("setting3");
}

现在,例如通过我写的页面,我们将setting2的值更改为“Happy Variable”;它可以很好地保存到数据库中,但现在我需要将它作为新值反映在 Web 应用程序中。由于它是静态类的静态只读属性,因此它只会在应用程序首次连接时被调用,并且无法手动设置。

重申一下,我不拥有原始类,因此“仅使属性可写”不是(当前)有效的选项。通常我会和我的老板讨论这个问题,他会做出判断,可能会允许我修改另一个班级,但我无法做出那个决定,而且他这周都不在办公室。

所以基本上; 一旦 Web 应用程序开始运行,有没有办法重新初始化静态类?我只需要它重新加载其所有属性,就好像该应用程序刚刚重建并重新启动一样。

4

9 回答 9

16
  ConstructorInfo constructor = typeof(Settings).GetConstructor(BindingFlags.Static | BindingFlags.NonPublic,null, new Type[0], null);
  constructor.Invoke(null, null);
于 2012-04-23T15:15:21.680 回答
4

你可以使用反射:

var prop = typeof(Settings).GetField("setting1", BindingFlags.Static | 
                                                 BindingFlags.Public);
prop.SetValue(null, "Bar");
string currentValue = Settings.setting1; //Bar
于 2012-04-23T15:09:40.467 回答
2

如果上面的代码代表了您所处的情况,那么您将无法重新初始化代码,除非您对反射做了一些特别骇人的事情(顺便说一句,不推荐这样做)。

编辑:哦等等 - 我没有意识到这是一个网络应用程序。您可以以编程方式反弹应用程序

System.Web.HttpRuntime.UnloadAppDomain
于 2012-04-23T15:03:51.127 回答
1

我想到的唯一选择是需要大量工作:

  1. 创建另一个 AppDomain
  2. 在另一个域中加载程序集
  3. 使用 Remoting 获取数据
  4. 如果设置更改,请卸载 AppDomain 并再次执行步骤 1 至 3
于 2012-04-23T15:07:16.177 回答
1

我会使用反射

var info = typeof(Settings)
.GetField("Settings",BindingFlags.Static|BindingFlags.Public);
info.SetValue(null, "setting4");
于 2012-04-23T15:10:15.933 回答
1
public static class Settings
{
   public static name = "";

   static Settings()
   {
    ReInitialize();
   }

   public static void ReInitialize()
   {
      name = "My name is re-initialized";
   }
}


Settings.name = "My name has changed";
// Console.WriteLine(Settings.name);
Settings.ReInitialize(); //name is "My name is re-initialized"
// Console.WriteLine(Settings.name);
于 2019-04-18T12:21:45.720 回答
0

嗯,你想找到破解课程的方法吗?即使它存在反射之类的东西,也不是解决这个问题的好方法

快速解决方法我可以建议您创建自己的非只读静态属性,使用该静态变量进行初始化并在任何地方使用它们

但最好使用缓存或应用程序存储而不是静态变量

希望这可以帮助

于 2012-04-23T15:08:27.347 回答
0

我知道旧线程,但我做的一件事是创建一个设置所有变量的Initialize方法(公共静态无效)(它们都是公共静态的)。在该方法中,进行数据库调用并设置类的变量。然后在代码中,只要您想刷新变量(即,只要您调用 SaveChanges()),您就可以调用 Class.Initialize() 并完成。

我使用它来缓存可以更改的常见查找信息列表,并且我们需要在从应用程序更新数据库时保持同步。

于 2016-12-13T16:11:26.843 回答
-1

将您的值更改为属性:

public static class Settings
{
 public static setting1
 {
   get { return SettingmanagerClass.GetSetting("setting1"); }
 }
 public static setting2
 {
   get { return SettingmanagerClass.GetSetting("setting2");
 }
 public static setting3
 {
   get { return SettingmanagerClass.GetSetting("setting3");
 }
}

此外,这不会更改代码的签名。

于 2012-04-23T15:05:37.133 回答