Подтвердить что ты не робот

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;
    }
4b9b3361

Ответ 1

Проблема, которую я описал, на самом деле не является реальной проблемой. Я читал на другом сайте, что < CreateCommands >b__8 часть трассировки стека означала, что проблема была в строке 8 метода CreateCommands. Это выровнялось точно с анонимным делегатом, и я мог видеть, как он соответствует поведению в отчете об ошибке.

Я действительно нашел решение своей проблемы, используя IL Dasm (который можно найти в

\ Program Files (x86)\Microsoft SDK\Windows\v7.0A\Bin

и открыл EXE, который был запущен, и нашел, что на самом деле было .net подумано b__8. Это оказалось еще одним анонимным делегатом, который явно вызывал .GetType(), поэтому проблема была действительно простой, как только я узнал, что на самом деле означает b__8.