C#替代(Application.OpenForms[0]作为Form1)
在已经打开的表单中调用方法时,是否有更好的替代代码C#替代(Application.OpenForms[0]作为Form1),c#,forms,C#,Forms,在已经打开的表单中调用方法时,是否有更好的替代代码 (Application.OpenForms[0] as Form1).someMethod(); 这行代码当然是在类中执行的 为了更清楚地说明这一点,这里有一个例子: 表格编号: public partial class Form1 : Form { public Form1() { InitializeComponent(); } public
(Application.OpenForms[0] as Form1).someMethod();
这行代码当然是在类中执行的
为了更清楚地说明这一点,这里有一个例子:
表格编号:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void someMethod()
{
//do stuff
}
}
类别代码:
class Class1
{
public void aMethod()
{
(Application.OpenForms[0] as Form1).someMethod();
}
}
有更好的方法调用someMethod吗?您可以始终为
Class1
提供表单实例。如果您的Class1实例尚未引用表单1实例,则没有其他方法。不过,这引出了几个问题
首先,如果Class1对象需要直接影响Form1实例,那么为什么它还没有那个引用呢?1级物体是从哪里来的?很可能是Form1实例创建的。如果是这样,为什么Form1在创建Class1对象时没有将对其自身的引用传递到Class1对象中
其次,为什么Class1对象直接影响Form1实例?更好的设计很可能是Class1对象引发Form1可以处理的事件,然后影响自身。最好的选择是不直接调用其他表单上的方法。您正在紧密绑定您的类和表单。我的建议是使用自定义事件。在类中创建一个事件。让表单订阅类的事件,当事件被触发时,类中的处理程序可以为您调用该方法。这样一来,你的
Class1
就不必知道任何关于Form1
的事情。这实际上是有道理的,我想我的方法只是一种快速的补救方法。你种什么就收获什么。不要弄脏了。使用带有this
的ctor不会吗?这听起来可能很愚蠢,但是,如何让“Form1将对自身的引用传递到Class1对象”?因此,如果Form1正在创建Class1实例,那么给Class1的构造函数一个Form1参数就很容易了。然后,在实例化它时,您可以这样做:Class1 myInstance=new Class1(this)代码>(当然是从表单中)。尽管如此,事件还是更好。编写Class1时,必须预期它将接收到该引用,因此必须添加适当的构造函数、方法或属性,就像您希望将数据传递到对象时通常所做的那样。它与任何其他数据都一样,所以don;Don’不要试图用不同的方式来思考问题,当事情不是这样的时候,就让它变得困难。与往常一样,Form1实例使用“this”关键字引用自身。