在静态方法中调用
本文关键字:调用 静态方法 | 更新日期: 2023-09-27 17:58:40
我在public
方法中有以下代码,但是如何在静态方法中使用它?o
是static 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本身非常复杂,在许多领域中,对于如何实现某些东西没有明确的单一选择。