![](/img/trans.png)
[英]C# Error: Object reference is required for the non-static field, method, or property
[英]Error in C#: “An object reference is required for the non-static field, method, or property”
我在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
{
/// <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');
}
}
}
}
但是這個人不想工作,我不明白為什么:
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);
在第一個代碼中,您位於一個繼承自Window
的類中,因此您在作用域中有一個Dispatcher
屬性,它返回Dispatcher
一個實例。 在第二個代碼中,您位於QRBarCode
類中,該類沒有Dispatcher
屬性; 因此編譯器假定您引用Dispatcher
類型,並嘗試在此類型上調用Invoke
,但由於它不是靜態方法,因此無法直接在類型上調用它。
你需要一個Dispatcher
實例來調用Invoke
; 你可以使用應用程序中的那個:
Application.Current.Dispatcher.Invoke(...);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.