Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MainWindow()强制静态,但我需要调用非静态参数(C#)_C# - Fatal编程技术网

MainWindow()强制静态,但我需要调用非静态参数(C#)

MainWindow()强制静态,但我需要调用非静态参数(C#),c#,C#,我正在构建一个文件监视程序,它从一个文件中加载数据,该文件被放到SQL中的指定位置。我所有的代码都很好,除了将UI中文本框中键入的变量传递给MainWindow之外的另一个类 首先,我初始化一个FileWatcher: public MainWindow() { InitializeComponent(); FileWatch.FileWatcherLoad(); } 调用文件监视程序进行初始化: public static void FileWatcherLoad() {

我正在构建一个文件监视程序,它从一个文件中加载数据,该文件被放到SQL中的指定位置。我所有的代码都很好,除了将UI中文本框中键入的变量传递给MainWindow之外的另一个类

首先,我初始化一个FileWatcher:

public MainWindow()
{
    InitializeComponent();
    FileWatch.FileWatcherLoad();
}
调用文件监视程序进行初始化:

public static void FileWatcherLoad()
{
    FileSystemWatcher watcher = new FileSystemWatcher();
    watcher.Path = //some path;
    watcher.NotifyFilter = NotifyFilters.LastWrite;
    watcher.Filter = "*.*";
    watcher.Changed += new FileSystemEventHandler(OnChanged);
    watcher.Created += new FileSystemEventHandler(OnChanged);
    watcher.EnableRaisingEvents = true;
}
出现此问题是因为MainWindow强制我将FileWatcherLoad声明为静态类型。从文件WatcherLoad()中删除静态类型时,出现错误:

an object reference is required for the non-static field, method or property 'FileWatch.FileWatcherLoad()'
请注意,FileWatcherLoad()位于另一个类FileWatch中,它是MainWindow的子类


这对我来说是一个问题,因为我希望在UI的文本框中使用用户输入的数据,但这是非静态的,因此在我声明所有其他内容为静态时会导致问题。

您必须执行以下操作:

FileWatch myWatch=new FileWatch(); 

然后调用你的方法等等。

当你调用
FileWatch.FileWatcherLoad()
你告诉编译器你想调用一个静态方法。如果要调用非静态方法,则需要对对象调用该方法

如果要在当前对象上调用该方法,可以调用
this.FileWatcherLoad()
或只调用
FileWatcherLoad()

如果该方法与从中调用该方法的方法不在同一个类中,则需要首先初始化一个对象

这可以通过使用
new
关键字来完成

var fileWatch = new FileWatch();
fileWatch.FileWatcherLoad();

这是因为您调用它的方式与
静态
成员函数的调用方式相同。如果您希望该方法成为实例方法,那么创建一个实例并像这样调用它

FileWatch watcher = new FileWatch();
watcher.FileWatcherLoad(); 
(或)只需
newfilewatch().FileWatcherLoad()

现在您可以将方法声明为
非静态
one

public void FileWatcherLoad()
    {
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = //some path;
        watcher.NotifyFilter = NotifyFilters.LastWrite;
        watcher.Filter = "*.*";
        watcher.Changed += new FileSystemEventHandler(OnChanged);
        watcher.Created += new FileSystemEventHandler(OnChanged);
        watcher.EnableRaisingEvents = true;
    }

您需要创建FileWatch的实例,并将其保存在窗口中的变量中。您似乎不了解静态与实例的概念,以及垃圾收集和变量作用域是如何工作的。我强烈建议您通过C#获取CLR的副本并阅读它。这不会花太长时间,您的境况会好上1000%。您来自Visual Basic,是吗?C#中没有默认实例-如果您想要某个对象的实例,则需要创建它并将引用存储在某个位置。在发布FileWatch的静态版本时,您的示例阅读起来很混乱。请在主窗体中声明一个字段,如:
private FileWatch FileWatch=new FileWatch()。然后使用
fileWatch.FileWatcherLoad()在构造函数中。这确实有效(删除引用问题),但会导致另一个错误。InitializeComponent()现在随系统中断。StackOverFlowException@DanG
StackOverflowException
主要意味着您有无限递归(示例=>一个永远调用自身的方法)。也许link可以帮助你解决这个问题。如果不是的话,我建议你问一个新问题。这很奇怪,因为如果我让它保持静态,那么它会说它很好,filewatcher工作得很好。声明变量会破坏它。我对这一切都很陌生,所以我对自己的失败并不感到惊讶it@DanG这不可能是关于方法的签名。我会逐步检查你的代码。我应该很容易找到那个不断循环的地方。如果您只添加了
newfilewatch
,那么它一定与这个类有关。这似乎与FileWatch是MainWindow的一个子类这一事实有关-当我删除它时,它现在可以工作了。谢谢