C#中出错:“非静态字段,方法或属性需要对象引用”

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

这段代码效果很好:

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 { ///  /// Interaction logic for MainWindow.xaml ///  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'); } } } } 

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

 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#\ PresidentProtocol \ PresidentProtocol需要对象引用\类\ QRCodeReader.cs

在这行代码上:

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

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

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

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