Мы испытали крушение в нашей программе, которую мы сейчас не можем воспроизвести. Я пытаюсь ввести код, чтобы предотвратить его повторение, но я запутался в трассировке стека.
System.NullReferenceException: Object reference not set to an instance of an object.
at System.Object.GetType()
at Project.ViewModel.MainVM.<CreateCommands>b__8(Object a)
at System.Windows.Controls.Button.OnClick()
- Я сократил трассировку стека, поскольку он просто переходит на загрузку системного кода, который просто связан с нажатием кнопки. -
Мне удалось вывести, что он указывает на мой анонимный делегат в строке 8 моего метода CreateCommands.
this.sectionCommand = new DelegateCommand(a =>
{
this.OnSectionParameterChanged((Sections)a);
}, p => this.IsSectionCommandExecutable);
Я видел подобную запись здесь, но OP вызывал GetType явно. Я предполагаю, что литые вызовы получают тип, но не имея возможности воспроизвести проблему, я не вижу, что такое null.
Итак, мой вопрос: для этой трассировки стека, чтобы вызвать нулевую ссылку, является ли переменная 'a' нулевым объектом? (так что я бы написал что-то вроде)
if (a != null)
{
this.OnSectionParameterChanged((Sections)a);
}
или это отбрасывается из "a" в "разделы", вызывая нулевой объект? (так что я должен написать что-то вроде)
if (a is Sections)
{
this.OnSectionParameterChanged((Sections)a);
}
Как запрошено здесь, OnSectionParameterChanged
private void OnSectionParameterChanged(Sections parameter)
{
this.SelectedSection = parameter;
this.RaisePropertyChanged(() => this.SelectedSection);
this.LoadSettingsPanel();
}
далее, что он вызывает LoadSettingsPanel
private void LoadSettingsPanel()
{
if (sectionVMs == null)
return;
// Get section
SectionViewModel = sectionVMs.SingleOrDefault(s.SectionName == SelectedSection);
this.IsSelectedSectionEnabled = this.Config.GetIsSectionEnabled(this.SelectedSection);
this.RaisePropertyChanged(() => this.IsSelectedSectionEnabled);
// Set advanced
AdvancedViewModel = this.SectionViewModel;
if (AdvancedViewModel != null)
HasAdvanced = AdvancedViewModel.HasAdvanced;
}