在静态方法中调用?

Invoke in a static method?

我在 public 方法中有以下代码,但是如何在静态方法中使用它? ostatic TextBox?

Invoke((MethodInvoker)delegate {
    o.Text = str + Environment.NewLine;
});

我已经阅读了 System.Reflection 命名空间中的 MethodInfo class,但似乎没有任何效果。只是为了告诉你,我想要这样的东西:

public static void writeOut(string str)
{
    Invoke((MethodInvoker)delegate {
        o.Text = str + Environment.NewLine; // runs on UI thread
    });
}

该代码不起作用,但我想知道如何在静态方法中调用 invoke,如上面的代码片段。

您问题的直接答案是使用 o.Invoke() 方法:

public static void writeOut(string str)
{
    o.Invoke((MethodInvoker)delegate {
        o.Text = str + Environment.NewLine; // runs on UI thread
    });
}

即假设 o 在此上下文中是一个有效的标识符,并且假设它确实引用了一个 TextBox 对象,那么您可以调用该 TextBox 对象的 Invoke() 方法。

就是说,我同意指出在您的表单中 static 引用控件实例是一个 确实 坏主意的评论。这是一种技巧,意味着您只能拥有一个表单实例,这意味着它依赖于在实例方法(例如构造函数)中正确初始化 static 字段。

如果您必须有一个 static 引用,请将其指向表单对象本身。更好的是,将表单对象引用传递给需要处理它的任何对象。你的问题中没有足够的上下文让我建议它到底是什么样子,但基本思想是只为真正静态的东西制作东西 static ,即与可能的类型完全无关实例化不止一次。


至于学习 WPF 的建议......

WPF 绝对是一个进步,值得学习,但它的曲线比 Winforms 陡峭得多。 Winforms 有一个简单的控制对象和事件驱动模型,带有一些最小的数据绑定功能。WPF 在很大程度上依赖于强大的 "separation of concerns" 编程方法、数据绑定和使用完全不同的语言来定义 UI 本身(即 XAML)。这些方法非常有用,如果正确实施,将会产生更好、更易于维护的代码。但是学习使用它们需要做更多的工作,而且 WPF API 本身非常复杂,并且在很多领域都没有一个明确的单一选择来实现某些东西。