C#从Form1中的静态方法获取现有Form1实例

C#从Form1中的静态方法获取现有Form1实例,c#,oop,instance,static-methods,C#,Oop,Instance,Static Methods,我知道这个问题很简单,但没有人能给出简单的答案 从Form1中的静态方法获取现有Form1实例 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { callMethod(); }

我知道这个问题很简单,但没有人能给出简单的答案

从Form1中的静态方法获取现有Form1实例

public partial class Form1 : Form
{
    public Form1()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        callMethod();           
    }

    public static void callMethod()
    {
       // how can get existing Form1 instance here ?             
       statusLabel.Text = "test";
    }
}

请注意,我为什么需要它并不重要,但重要的是知道如何使用。

您可以将Form1作为参数传递给callMethod

public static void callMethod(Form form1)
{

   form1.doSomething(); //use Form1 instance
   statusLabel.Text = "test";

}
您可以将Form1实例传递给它。例如,如果从Form1中调用,您可以在下面调用它,例如:在它的一个成员函数上:

Form1.callMethod(this);
但是,如果您想在某个地方调用它,而您不持有Form1的实例,因此无法将其作为参数传递,则可以尝试使用Singleton模式,这样您就可以将其编码为以下代码:

public static void callMethod()
{

   Form1.instance().doSomething(); //use Form1 instance
   statusLabel.Text = "test";

}

关键字“
this
”返回对包含它的类的当前实例的引用

静态方法(或任何静态成员)不属于特定实例。它们的存在没有创建类的实例

除非将任何成员设置为静态,否则无法真正访问它们。在您的情况下,假设
statusLabel
是textbox,它将不允许您通过静态方法访问它

要么使你的函数非静态,要么你可以使用下面的代码

callMethod(statusLabel);  

public static void callMethod(Label txt)
 {

    txt.Text = "test";
 } 

你可以这样做,尽管我仍然建议为你需要的值分离或创建一个模型,并传递给大家。请参阅.net的消息概念

public static Form1 Instance
{
   get
   {
      return instance;
   }
}
并将其添加到构造函数中

    private static Form1 instance;
    public Form1()
    {
        instance = this;
        InitializeComponent();
    }

如何从静态方法调用Form1.callMethod(this)?“this”在静态属性中无效。如果在Form1实例中调用它,则可以这样调用它,例如:在它的一个成员函数上(非静态)。我以前不知道您打算从另一个静态方法调用Form1.callMethod()。我已经编辑添加了在您无法直接访问实例时使用Singleton模式的替代方案。谢谢,但Singleton将检查现有实例,如果不存在,则将实例化该类,要使用现有实例,我需要使用“this”,但正如我在前面的注释“this”中所述在静态属性yyes中无效,我从来没有打算将此用作静态属性。它是一个引用当前实例的关键字,因此如果在实例中使用它,则它具有有效值,例如:在成员(非静态)函数中。正如我所说,之前我认为您将在Form1实例中调用它。我应该先澄清一下。状态标签是什么?是静态的吗?@Sangram,不,不是静态的。@Sever这是为了什么?这似乎大错特错,真的!“this”在静态属性中无效