在静态方法中调用

本文关键字:调用 静态方法 | 更新日期: 2023-09-27 17:58:40

我在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,就像上面的代码片段一样。

在静态方法中调用

问题的直接答案是使用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在很大程度上依赖于强大的"关注点分离"编程方法、数据绑定,以及使用完全不同的语言来定义UI本身(即XAML)。这些方法非常有用,如果正确实现,将产生更好、更可维护的代码。但要学会使用它们还有很多工作要做,而且WPF API本身非常复杂,在许多领域中,对于如何实现某些东西没有明确的单一选择。