【问题标题】:How do I access an instance of a class from a static method?如何从静态方法访问类的实例?
【发布时间】:2014-10-16 21:12:27
【问题描述】:

如何从静态方法访问类的当前实例?静态方法是必要的。我只想获取父表单的当前子表单的计数。我的代码在下面,但它说“应用程序”在当前上下文中不存在

private static ReturnOpenWindowCount()
    {
      Form f = (Form)Application.OpenForms["Form1"]
      if(f.Children.Length > 0){//Do Something;}
    }  

【问题讨论】:

  • 您的代码中的Application 是什么? System.Windows.Forms.Application?如果是这样,你只是错过了using System.Windows.Forms;
  • 我们需要比您在此处提供的更多的细节。我倾向于同意德米特里的观点;您只是缺少using 声明。
  • 你有什么运气让它工作吗?
  • 我刚刚创建了一个我需要引用的表单的静态实例。然后在表单普通构造函数中我做了: private static FORMCOPY = this;所以在我的静态方法中,它看到了 FORMCOPY,我可以从中获取我需要的任何表单或数据。不知道这是否是最好的编码方式,但它有效。

标签: c# winforms static


【解决方案1】:

你不能,静态方法没有“当前实例”。您可以在周围有 100 个实例或 0 个实例时调用静态方法,它在这两种情况下都可以工作。它与任何实例都没有关系,除非您明确地创建一个,例如通过保留实例化表单的私有静态数组。这很可能是不好的风格和XY solution,尽管与表单有关。

【讨论】:

    【解决方案2】:

    Youc 可以将参数中的Application 实例传递给此方法

    【讨论】:

    • 我认为这行不通。 Application 上的大部分方法都是static,所以在代码中引用方法参数时,它们不会暴露在方法参数中。在 Visual Studio 中检查它。 OpenForms 是一个静态的 FormCollection 属性,对于 Application 类型的参数,也不会出现在 Intellisense 中。
    【解决方案3】:

    将实例作为参数传递。尽可能接近..

    void Main()
    {
    Foo foo = new Foo();
    
    Foo.ThisFoo(foo);
    
    Console.WriteLine(foo);
    
    Console.ReadLine();
    
    }
    
    // Define other methods and classes here
    class Foo  
    {
    
    int x = 0;
    
    public static void ThisFoo(Foo foo)
    {
        foo.x = 1;
    }
    
    public override string ToString()
    {
        return "" + x;
    }
    }
    

    【讨论】:

    • @RobertHarvey 但我表明你可以访问私有字段
    猜你喜欢
    • 2023-03-07
    • 2023-03-08
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多