Erreur dans C #: "Une référence d'objet est requise pour le champ, la méthode ou la propriété non statique"
J'ai écrit le code dans WPF. Tout d'abord, j'ai écrit un projet distinct pour tester de travail avec un Port COM appareil, et il a bien fonctionné. Ensuite, j'ai décidé de l'intégrer dans un autre projet, mais j'obtiens une erreur. Je n'ai pas de changer le code; je suis juste copié dans un nouveau fichier de code.
Ce code fonctionne bien:
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');
}
}
}
}
Mais celui-ci ne veulent pas travailler, et je ne comprends pas pourquoi:
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);
}
}
}
Erreur:
Une référence d'objet est requise pour la non-statique champ, une méthode ou une propriété du Système".De Windows.Le filetage.Répartiteur.Invoke(Système D'.De Windows.Le filetage.DispatcherPriority, Système.Délégué, objet)'
E:\C#\PresidentProtocol\PresidentProtocol\classes\QRCodeReader.cs
sur cette ligne de code:
Dispatcher.Invoke(DispatcherPriority.Send, new UpdateUiTextDelegate(DisplayText), recieved_data);
source d'informationauteur Yury Kerbitskov
Vous devez vous connecter pour publier un commentaire.
Dans le premier code, vous êtes dans une classe qui hérite de
Window
de sorte que vous avez unDispatcher
propriété dans la portée, ce qui renvoie une instance deDispatcher
. Dans le deuxième code, vous êtes dans leQRBarCode
classe, qui n'ont pas deDispatcher
de la propriété; ainsi, le compilateur suppose que vous faites allusion à laDispatcher
type, et tente de l'appelerInvoke
sur ce type, mais puisque ce n'est pas une méthode statique, il ne peut pas être appelé directement sur le type.Vous avez besoin d'une instance de
Dispatcher
appelerInvoke
; vous pouvez utiliser l'une à partir de l'application: