2

Null参照例外が発生しますが、理由がわかりません(コードを参照)。

私が作っているデシリアライザーの一部として次のコードがあります。次のコードは、クラスの逆シリアル化されたインスタンスにいくつかのキーがない場合に、デフォルトのキー/値を辞書のセットに追加します。これは、顧客が私のプラグインの新しいバージョンをデプロイするときに、すべてのキーを持っていなくても、古い設定が適切に脱滅菌されるようにするためです。

これが私のコードです:

private Dictionary<string, T> AddMissingSettings<T>(Dictionary<string, T> settingsObject, bool forceDefaults, string[] settingsList)
{
    if (forceDefaults || settingsObject == null)
    {
        settingsObject = new Dictionary<string, T>();
    }
    foreach (string t in settingsList)
    {
        if (!settingsObject.ContainsKey(t))
        {
            settingsObject.Add(t, default(T));// Null Reference Exception Here
        }
    }
    return settingsObject;
}

このメソッドを呼び出す例を次に示します。

Dictionary<string, DateTime> Times = getlistoftimesettingsfromdata();
//Note: Not the real way Times gets set, but whatever
Times = AddMissingSettings<DateTime>(Times, forceDefaults, new string[] { "LastEmailUpdate", "IdealRegularReportTime", "LastRegularReport" });
//Also, pretty sure the "Times = " here is redundant, but let it pass

VPNdを編集して、使用している実際のコードを投稿します。コンパイルして実行されていることを確認できます。

    private void LoadDefaults(bool forceDefaults)
    {
        if (RegularReportDays == null || forceDefaults) { RegularReportDays = new List<DayOfWeek>(); }
        if (RegularReportSubscribers == null || forceDefaults) { RegularReportSubscribers = new List<string>(); }
        Times = AddMissingSettings<DateTime>(Times, forceDefaults, DateTime.MinValue, new string[] { "LastEmailUpdate", "IdealRegularReportTime", "LastRegularReport" });
        Toggles = AddMissingSettings<bool>(Toggles, forceDefaults, false, new string[] { "AutomaticUpdates", "AutomaticUpdatesAlerts", "SendRegularReports" });
    }

    private Dictionary<string, T> AddMissingSettings<T>(Dictionary<string, T> settingsObject, bool forceDefaults, T defaultValue, string[] settingsList)
    {
        if (forceDefaults || settingsObject == null)
        {
            settingsObject = new Dictionary<string, T>();
        }
        foreach (string t in settingsList)
        {
            if (!settingsObject.ContainsKey(t))
            {
                settingsObject.Add(t, defaultValue);
            }
        }
        return settingsObject;
    }
4

2 に答える 2

2

さて、私は月曜日に新鮮で明るく戻ってきて、問題が何であるかがわかります. 問題は発生していました-他の人が嗅ぎつけたように-スタックのさらに上。このソリューションの鍵は、関連性があるとは思わなかったので言及しなかった場所にあります (申し訳ありません)。

次のスタックを実行しようとしていました

  • private Dictionary<string, T> AddMissingSettings<T>(Dictionary<string, T> settingsObject, bool forceDefaults, string[] settingsList)
  • private void LoadDefaults(bool forceDefaults)
  • public BookEasyImportServiceSettings(SerializationInfo info, StreamingContext cxt)

オブジェクトのデシリアライズ中に、オブジェクトのメンバーを変更しようとしていることに気付くかもしれません。あなたにはそれができないようです。そこで、インターフェイスにパブリックLoadMissingDefaultsメソッドを追加し、BinaryFormatter.Deserialize(Stream)終了時にそれを呼び出します。

さて、私は自分自身に答えを与えるのが本当に好きではありません (同じように、私は自分の問題を解決し、自分の解決策を共有しないのが好きではないので、時々そうします)。なぜこれが当てはまるのか、および/またはそれを行うためのより良い方法について、誰かが良い回答を提出できる場合は、受賞した回答を彼らに切り替えます.

于 2012-10-08T05:45:04.600 に答える
1

nullのキーとして使用することはできませんDictionary。あなたのコードからsettingsListstring[]であり、 でstringある可能性がありますnull。に追加する前に null を確認することをお勧めしますsettingObject

foreach (string t in settingsList) 
{ 
    if (t != null && !settingsObject.ContainsKey(t)) 
    { 
        settingsObject.Add(t, default(T));// Null Reference Exception Here 
    } 
} 
于 2012-10-05T09:47:02.987 に答える