【问题标题】:How can I reference a method from another class without instantiating it?如何在不实例化的情况下引用另一个类的方法?
【发布时间】:2009-10-23 14:49:07
【问题描述】:

我不想创建对象,因为它不会影响我的可见表单。我怎样才能调用一个方法,以便它在事物的可见方面做它的事情。

public class foo
{
   public void SetString(string foo)
   {
       label1.Text = foo;
   }
}

在另一个类中:

foo X = new foo();
X.SetString("testlololol");

这将设置标签,但实际上,我将无法在我的表单上看到它。

我怎样才能做同样的事情,但在我的可见方面?

【问题讨论】:

    标签: c# winforms forms class


    【解决方案1】:

    当您创建可见表单时,将对它的引用存储在某个静态属性中。然后其他类可以使用该属性来运行该类的公共方法。

    // the original form
    class MyForm()
    {
         // form public method
         public void MyMethod() { ... }
    }
    
    // class storing the reference to a form
    class MyOtherClass
    {     
        public static Form MyForm;
    
        public void ShowForm()
        {
            MyForm = new MyForm();
            MyForm.Show();
        }
    }
    
    // invoke form public method in this class
    class YetAnotherClass
    {
        public void SomeMethod ()
        {
            MyOtherClass.MyForm.MyMethod();
        }
    }
    

    【讨论】:

      【解决方案2】:

      您需要以某种方式获取 可见的实例。从已经了解您的表单(或其他任何形式)的事物到您的其他代码,找出一些信息路径。考虑一下如果有两种可见的形式会发生什么——你想要哪一种?这应该表明了前进的方向。如果您知道只有一个可见实例这一事实,您可以使用单例 - 但我强烈建议您不要这样做。

      请记住,您可能不需要通过其完整类型名称来了解它 - 如果这是跨层,您可能希望以某种抽象方式制定一些接口,包括操作。

      【讨论】:

      • 我不太明白。我如何获得可见的东西? :S
      • @Papuccino1:我假设你已经得到一些可见的东西,对吧?如果不是,我不明白这个问题。如果是这样,您需要以某种方式将该引用传递给需要它的代码。
      【解决方案3】:

      我通常会将我的表单的引用(在本例中为“foo”)传递给其他类。或者我会将“foo”的副本存储到某个静态位置。如果您知道只有 1 个 'foo' 实例,您可以执行以下操作:

      public class foo
      {
         public static foo Current { get; private set; }
      
         public foo()
         {
             foo.Current = this;
         }
      
         public void SetString(string foo)
         {
             label1.Text = foo;
         }
      }
      

      ...和...

      foo.Current.SetString("testlololol");
      

      虽然这有点 hacky IMO,并且不支持 'foo' 的多个实例。

      【讨论】:

        【解决方案4】:

        您的第二个类需要有对可见类实例的引用。

        public class OtherClass{
          foo myFoo;
        
          public OtherClass( foo visibleFoo )
          {
             myFoo = visibleFoo;
          }
        
          public void method()
          {
             myFoo.SetString("testlolol");
          }
        

        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-05
          • 1970-01-01
          • 2018-12-19
          • 2012-02-07
          • 2014-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多