【问题标题】:Invoke in a static method?在静态方法中调用?
【发布时间】:2026-02-08 13:20:02
【问题描述】:

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

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

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

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

该代码不起作用,但我想知道如何做一些可以在静态方法中调用 invoke 的东西,例如上面的 sn-p。

【问题讨论】:

  • "ostatic TextBox",所以是的。
  • 为什么o 是静态的static TextBox
  • 有点上下文,我想从不同的线程更改文本框的内容,我想从静态方法中做到这一点。所以我做private static TextBox o,然后在构造函数中我做o = output。输出是o 指向的文本框。 -- imgur.com/a/GtryL
  • 这是一个非常糟糕的主意
  • 有什么更好的方法?

标签: c# winforms static-methods invoke system.reflection


【解决方案1】:

您的问题的直接答案是使用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() 方法。

也就是说,我同意 cmets 的观点,他们指出在您的表单中使用 static 对控件实例的引用是一个真的坏主意。这是一种 hack,意味着您只能拥有一个表单实例,这意味着它依赖于在实例方法(例如构造函数)中正确初始化 static 字段。

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


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

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

【讨论】: