1

我正在尝试在另一个类中使用类内部的方法。

namespace Crystal.Utilities
{
   public class Logging
   {
      public static void Log()
      {
          //dostuff
          Crystal.MainForm.general_log_add_item("Hello World");
      }
   }
}

namespace Crystal
{
   public partial class MainForm : Form
   { 
      public void general_log_add_item(string msg)
      {
         listBox1.Items.Add(msg);
      }
   }
} 

我希望能够从任何地方调用 Crystal.Utilities.Logging.Log() ,并且能够调用 Crystal.MainForm.general_log_add_item() 。但它不允许我,因为如果我把它设为公开,那么我就看不到它,如果它是静态的,那么它就不能与我的列表框交互。

4

4 回答 4

4

这是错误的做法。您的类不应调用 UI,因为 UI 可能会更改。该类不应该知道也不关心 UI。相反,该类可以公开表单可以订阅的事件,并根据事件参数中包含的信息进行更新。

这是一个匆忙拼凑起来的例子。

class Program
{
    static void Main()
    {
        Logger.OnLogging += Logger_OnLogging;
        Logger.Log();
        Logger.OnLogging -= Logger_OnLogging;
    }

    static void Logger_OnLogging(LoggingEventArgs e)
    {
        Trace.WriteLine(e.Message);
    }
}

public class Logger
{
    public delegate void LoggingEventHandler(LoggingEventArgs e);

    public static event LoggingEventHandler OnLogging;

    public static void Log()
    {
        // do stuff
        RaiseLoggingEvent("Data logged");
    }

    protected static void RaiseLoggingEvent(string message)
    {
        if (OnLogging != null)
            OnLogging(new LoggingEventArgs(message));
    }
}

public class LoggingEventArgs : EventArgs
{
    public LoggingEventArgs(string message)
    {
        this.Message = message;
    }

    public string Message { get; private set; }
}
于 2010-09-22T21:14:25.813 回答
3

与其将其实现为静态方法,不如尝试将其实现为单例。在范围内使实例成为全局实例并限制为一个实例,而不使所有内容都静态(因此无法用作实例)是一种常见的技巧。

于 2010-09-22T20:53:58.267 回答
2

你要明白窗口不是静态的,有他的一个实例,这就是为什么方法不能是静态的,你可以使用Application.Windows到达这个实例并调用add方法。

或者您可以在他的构造函数中注册另一个将调解日志记录和窗口的类的窗口。

如果你不明白告诉我,我会尽量说得更清楚

于 2010-09-22T20:51:41.367 回答
2

当您将方法声明为“静态”时,您是在说它不依赖于它所在类的特定实例。
例如,如果您有一个名为“chair”的类并且您想计算有多少椅子,您' 将使用静态字段和返回该字段值的静态方法来执行此操作。
所有椅子的计数与特定椅子无关。
在您的情况下,您想要添加一个静态方法以将项目添加到表单的特定实例。这是不可能的,也没有意义。
如果要向列表框中添加项目,则必须通过公共方法。
所以基本上我要说的是——重新考虑你想要做什么,有一个很好的解释来解释为什么你没有成功。

于 2010-09-22T21:04:59.117 回答