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」に変更します。DB に問題なく保存されますが、新しい値として Web アプリに反映する必要があります。これは静的クラスの静的読み取り専用プロパティであるため、アプリが最初に接続されたときにのみ呼び出され、手動で設定することはできません。

繰り返しますが、私は元のクラスを所有していないため、「プロパティを書き込み可能にするだけ」は (現在) 有効なオプションではありません。通常、私は上司とこれについて話し合うだけで、彼は判断を下し、場合によっては他のクラスを変更することを許可しますが、私はその決定を下す立場になく、彼は 1 週間不在です。

だから基本的に; 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

上記のコードが現在の状況を表している場合、リフレクションで特にハックなことをしない限り、コードを再初期化することはできません (ちなみに、これはお勧めしません)。

編集: ちょっと待ってください。これが Web アプリだとは知りませんでした。アプリケーションをプログラムでバウンスできます。

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 に答える
0

うーん、クラスをハックする方法を見つけたいですか?リフレクションなどで存在していても、これを解決するのは良い方法ではありません

読み取り専用ではない静的プロパティを作成し、その静的変数で初期化してどこでも使用することをお勧めします。

ただし、静的変数の代わりにキャッシュまたはアプリケーション ストアを使用することをお勧めします。

お役に立てれば

于 2012-04-23T15:08:27.347 に答える
0

私が知っている古いスレッドですが、私が行ったことの1つは、すべての変数を設定するInitializeメソッド(public static void)を作成することです(それらはすべてpublic staticです)。そのメソッドでは、データベース呼び出しが行われ、クラスの変数が設定されます。コードでは、変数を更新したいときはいつでも (つまり、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 に答える