【问题标题】:C# obtain existing Form1 instance from static method in Form1C#从Form1中的静态方法获取已有的Form1实例
【发布时间】:2013-12-12 05:58:59
【问题描述】:

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

从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";
    }
}

拜托,我为什么需要这个并不重要,重要的是知道如何做。

【问题讨论】:

  • 状态标签是什么?是静态的吗?
  • @Sangram,不,它不是静态的。
  • @Sever 这样做的目的是什么?这似乎大错特错,真的!

标签: c# oop instance static-methods


【解决方案1】:

您可以这样做,但我仍然建议为您需要的值分离或创建一个模型并将其传递。查看.net的消息概念

public static Form1 Instance
{
   get
   {
      return instance;
   }
}

并将其添加到您的构造函数中

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

【讨论】:

  • “this”在静态属性中无效
【解决方案2】:

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

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

除非您将其设为静态,否则您无法真正访问任何成员。在您的情况下,假设 statusLabel 是文本框,它不允许您在静态方法内部访问它。

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

callMethod(statusLabel);  

public static void callMethod(Label txt)
 {

    txt.Text = "test";
 } 

【讨论】:

    【解决方案3】:

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

    public static void callMethod(Form form1)
    {
    
       form1.doSomething(); //use Form1 instance
       statusLabel.Text = "test";
    
    }
    

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

    Form1.callMethod(this);
    

    但是,如果您想在没有 Form1 实例的地方调用它,因此不能将其作为参数传递,您可以尝试使用单例模式,这样您就可以将其编码如下:

    public static void callMethod()
    {
    
       Form1.instance().doSomething(); //use Form1 instance
       statusLabel.Text = "test";
    
    }
    

    【讨论】:

    • 如何从静态方法调用 Form1.callMethod(this) ? “this”在静态属性中无效。
    • 如果你在 Form1 实例中调用它,你会这样称呼它,例如:在它的一个成员函数(非静态)上。我以前不知道您的意思是从另一个静态方法调用 Form1.callMethod() 。当您无法直接访问实例时,我已经编辑添加了使用单例模式的替代方案。
    • 谢谢,但 Singelton 会检查现有实例,如果不存在,则将实例化该类,并且要使用现有实例,我需要使用“this”,但正如我在前面所述评论“this”在静态属性中无效
    • 是的,我从来没有打算将this 用作静态属性。它是一个引用当前实例的关键字,因此如果您在 instance 中使用它,它具有有效值,例如:在成员(非静态)函数中。就像我说的,之前我以为你会在 Form1 实例中调用它。我应该先澄清一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 2011-07-11
    相关资源
    最近更新 更多