我收到了Null Reference Exception,但无法找出原因(参见代码)。
我将以下代码作为我正在制作的反序列化器的一部分。当我的类的反序列化实例缺少某些键时,以下代码将默认键/值添加到一组字典。这样做的原因是,当客户部署我的插件的新版本时,即使他们没有所有密钥,他们的旧设置仍将正确地进行设置。
这是我的代码:
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
EDIT VPN工作以发布我正在使用的实际代码。我可以确认它编译并运行。
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;
}
答案 0 :(得分:1)
您无法将null
用作Dictionary
中的密钥。您的代码settingsList
为string[]
,string
可为null
。我建议您在将其添加到settingObject
之前检查null。
foreach (string t in settingsList)
{
if (t != null && !settingsObject.ContainsKey(t))
{
settingsObject.Add(t, default(T));// Null Reference Exception Here
}
}
答案 1 :(得分:1)
好的,所以周一我恢复了新鲜和光明,我知道问题是什么。这个问题正在发生 - 正如其他人已经嗤之以鼻 - 进一步上升。这个解决方案的关键在于我没有提到的地方,因为我认为它不相关(抱歉)。
我试图运行以下堆栈
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)
完成后调用它。
现在,我真的不喜欢给自己的答案(虽然同样,我不喜欢解决我的问题而不是分享我的解决方案 - 所以我有时会这样做)。如果有人能够提供一个很好的答案,为什么会出现这种情况和/或更好的方式,我会将获奖答案换成他们。