在静态方法中调用?

时间:2016-07-27 01:58:48

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

我在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,如上面的代码片段。

1 个答案:

答案 0 :(得分: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对象{{1方法。

尽管如此,我同意这些评论,指出在表单中对控件实例进行Invoke()引用是一个真的坏主意。它是一个hack,意味着你只能拥有一个表单实例,这意味着它依赖于在实例方法中正确初始化static字段(例如构造函数)。

如果您必须拥有static引用,请将其设置为表单对象本身。更好的是,将表单对象引用传递给需要处理它的任何对象。在你的问题中,我没有足够的背景来建议究竟是什么样子,但基本的想法是只为那些真正静态的东西制作static,即根本不相关的东西。可以多次实例化的类型。


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

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