Mystery System.Object.GetType() NullReferenceException
Мы испытали крушение в нашей программе, которую мы сейчас не можем воспроизвести. Я пытаюсь ввести код, чтобы предотвратить его повторение, но я запутался в трассировке стека.
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;
}
Ответы
Ответ 1
Проблема, которую я описал, на самом деле не является реальной проблемой. Я читал на другом сайте, что < CreateCommands >b__8
часть трассировки стека означала, что проблема была в строке 8 метода CreateCommands
. Это выровнялось точно с анонимным делегатом, и я мог видеть, как он соответствует поведению в отчете об ошибке.
Я действительно нашел решение своей проблемы, используя IL Dasm (который можно найти в
\ Program Files (x86)\Microsoft SDK\Windows\v7.0A\Bin
и открыл EXE, который был запущен, и нашел, что на самом деле было .net подумано b__8
. Это оказалось еще одним анонимным делегатом, который явно вызывал .GetType()
, поэтому проблема была действительно простой, как только я узнал, что на самом деле означает b__8
.