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”关键字引用自身。