我正在处理的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应用程序中。由于它是静态类的静态只读属性,因此只有在应用程序首次连接并且无法手动设置时才会调用它。
重申一下,我不拥有原始类,因此“只使属性可写”不是(当前)有效选项。通常我会和我的老板谈谈这件事,他会做出一个判断电话,并且可能允许我修改另一个班级,但是我无法接听电话,他本周不在办公室。 / p>
所以基本上;一旦Web应用程序开始运行,有没有办法重新初始化静态类?我只需要重新加载它的所有属性,就好像应用程序刚刚重建并重新启动一样。
答案 0 :(得分:14)
ConstructorInfo constructor = typeof(Settings).GetConstructor(BindingFlags.Static | BindingFlags.NonPublic,null, new Type[0], null);
constructor.Invoke(null, null);
答案 1 :(得分:4)
你可以使用反射:
var prop = typeof(Settings).GetField("setting1", BindingFlags.Static |
BindingFlags.Public);
prop.SetValue(null, "Bar");
string currentValue = Settings.setting1; //Bar
答案 2 :(得分:2)
如果上面的代码代表你所处的情况,你将无法重新初始化代码,除非你做了一些特别讨厌的反思(顺便说一下,这不推荐)。
编辑:哦等等 - 我没有意识到这是一个网络应用程序。您可以通过编程bounce the application:
System.Web.HttpRuntime.UnloadAppDomain
答案 3 :(得分:1)
我想到了唯一需要做大量工作的选择:
答案 4 :(得分:1)
我会使用反射
var info = typeof(Settings)
.GetField("Settings",BindingFlags.Static|BindingFlags.Public);
info.SetValue(null, "setting4");
答案 5 :(得分: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);
答案 6 :(得分:0)
快速解决方法我可以建议您创建自己的非只读静态属性,使用该静态变量初始化并在任何地方使用它们
但最好使用Cache或Application存储而不是静态变量
希望这有帮助
答案 7 :(得分:0)
旧线程我知道,但我做的一件事是创建一个 Initialize 方法(public static void)来设置所有变量(它们都是公共静态)。在该方法中,进行数据库调用并设置类的变量。然后在代码中,只要你想刷新变量(即任何时候调用SaveChanges()),你就可以调用Class.Initialize()并完成。
我使用它来缓存可以更改的常见查找信息列表,我们需要在应用程序更新数据库时保持同步。
答案 8 :(得分:-2)
将您的值更改为属性:
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");
}
}
此外,这不会改变代码的签名。