Error in C#: "An object reference is required for the non-static field, method, or property"

24,111

In the first code, you are in a class that inherits from Window, so you have a Dispatcher property in scope, which returns an instance of Dispatcher. In the second code, you're in the QRBarCode class, which doesn't have a Dispatcher property; so the compiler assumes you're referring to the Dispatcher type, and tries to call Invoke on this type, but since it's not a static method, it can't be called directly on the type.

You need an instance of Dispatcher to call Invoke; you can use the one from the application:

Application.Current.Dispatcher.Invoke(...);
Share:
24,111
Yury Kerbitskov
Author by

Yury Kerbitskov

I know little about everything and all about little. Workaholic with a good sense of humour. Can do unreal things in unreal time period. Easily studying new things, absorbing new knowledge like a sponge. I like everything about computer technologies as well as time travelling and teleportation. Sometimes playing around with Linux. Have a leader skills. I’m trying always to get evolve my professional, personal and spiritual skills and knowledge. I’m not smoke and not drink alcohol at all. The theme of my PhD work is face recognition in intelligence systems.

Updated on October 16, 2020

Comments

  • Yury Kerbitskov
    Yury Kerbitskov over 3 years

    I wrote code in WPF. Firstly, I wrote a separate project to test work with a COM port device, and it worked well. Next I decided to integrate it in another project, but I get an error. I didn't change the code; I am just copied it into a new code file.

    This code works well:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.IO.Ports;
    using System.Windows.Threading;
    
    namespace WpfApplication2
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                serial.BaudRate = 9600;
                serial.Handshake = System.IO.Ports.Handshake.None;
                serial.Parity = Parity.None;
                serial.DataBits = 8;
                serial.StopBits = StopBits.One;
                serial.ReadTimeout = 200;
                serial.WriteTimeout = 500;
                serial.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(Recieve);
            }
    
            SerialPort serial = new SerialPort();
            private string recieved_data;
    
            private delegate void UpdateUiTextDelegate(string text);
    
            private void Recieve(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                if (serial.IsOpen)
                {
                    try
                    {
                        recieved_data = serial.ReadLine();
                        Dispatcher.Invoke(DispatcherPriority.Send, new UpdateUiTextDelegate(DisplayText), recieved_data);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            }
    
            private void DisplayText(string code)
            {
                textBox1.AppendText(string1);
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                ListBoxItem lbi = new ListBoxItem();
                lbi = (ListBoxItem)listBox1.SelectedItem;
                serial.Close();
                serial.PortName = "COM" + (string)lbi.Content;
                try
                {
                    serial.Open();
                    textBox1.AppendText("Device opened at " + serial.PortName + '\n');
                }
                catch (Exception ex)
                {
                    textBox1.AppendText(ex.Message + '\n');
                }
            }
        }
    }
    

    But this one doesn't want to work, and I can't understand why:

    using System.IO.Ports;
    using System.Windows.Threading;
    using System;
    using System.Windows;
    
    namespace PresidentProtocol
    {
        public class QRBarCode
        {
           // private SerialPort serial = new SerialPort();
    
            public QRBarCode(string com)
            {
                serial.BaudRate = 9600;
                serial.Handshake = System.IO.Ports.Handshake.None;
                serial.Parity = Parity.None;
                serial.DataBits = 8;
                serial.StopBits = StopBits.One;
                serial.ReadTimeout = 200;
                serial.WriteTimeout = 500;
                serial.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(Recieve);
                serial.Close();
                serial.PortName = com;
                try
                {
                    serial.Open();
                }
                catch (Exception)
                {
                    MessageBox.Show("Error opening COM port.");
                }
            }
    
            SerialPort serial = new SerialPort();
            private string recieved_data;
    
    
            private delegate void UpdateUiTextDelegate(string text);
    
            private void Recieve(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                if (serial.IsOpen)
                {
                    try
                    {
                        recieved_data = serial.ReadLine();
                        Dispatcher.Invoke(DispatcherPriority.Send, new UpdateUiTextDelegate(DisplayText), recieved_data);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            }
    
            private void DisplayText(string code)
            {
                MessageBox.Show(code);
            }
        }
    }
    

    Error:

    An object reference is required for the non-static field, method, or property 'System.Windows.Threading.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority, System.Delegate, object)' E:\C#\PresidentProtocol\PresidentProtocol\classes\QRCodeReader.cs

    on this line of code:

    Dispatcher.Invoke(DispatcherPriority.Send, new UpdateUiTextDelegate(DisplayText), recieved_data);