C# 中的错误:“非静态字段、方法或属性需要对象引用"

Error in C#: quot;An object reference is required for the non-static field, method, or propertyquot;(C# 中的错误:“非静态字段、方法或属性需要对象引用)
本文介绍了C# 中的错误:“非静态字段、方法或属性需要对象引用"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 WPF 中编写代码.首先,我编写了一个单独的项目来测试使用 COM 端口 设备的工作,然后它运作良好.接下来我决定将其集成到另一个项目中,但出现错误.我没有更改代码;我只是将它复制到一个新的代码文件中.

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.

这段代码运行良好:

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 + '
');
            }
            catch (Exception ex)
            {
                textBox1.AppendText(ex.Message + '
');
            }
        }
    }
}

但是这个不想工作,我不明白为什么:

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);
        }
    }
}

错误:

非静态字段、方法或属性System.Windows.Threading.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority, System.Delegate, object)"需要对象引用E:C#PresidentProtocolPresidentProtocolclassesQRCodeReader.cs

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#PresidentProtocolPresidentProtocolclassesQRCodeReader.cs

在这行代码上:

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

推荐答案

在第一个代码中,你在一个继承自 Window 的类中,所以你有一个 Dispatcher 范围内的属性,它返回 Dispatcher 的实例.在第二个代码中,您位于 QRBarCode 类中,该类没有 Dispatcher 属性;因此编译器假定您指的是 Dispatcher 类型,并尝试在此类型上调用 Invoke,但由于它不是静态方法,因此无法调用直接在类型上.

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.

你需要一个Dispatcher的实例来调用Invoke;您可以使用应用程序中的那个:

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

Application.Current.Dispatcher.Invoke(...);

这篇关于C# 中的错误:“非静态字段、方法或属性需要对象引用"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)