我正在尝试在类中使用另一个类的方法。
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()。但它不会让我,因为如果我把它公之于众,那么我就看不到它,如果它是静态的那么它就无法与我的列表框进行交互。
答案 0 :(得分: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; }
}
答案 1 :(得分:3)
不要将其作为静态方法实现,而是尝试以单例形式实现。这是一个常见的技巧,可以使实例在范围内全局化,并限制为一个实例,而不会使所有内容都静态(因此无法用作实例)。
答案 2 :(得分:2)
你必须明白窗口不是静态的,有一个他的实例,这就是为什么这个方法不能是静态的, 您可以使用 Application.Windows到达此实例并调用add方法。
或者你可以在他的构造函数中注册另一个将调解Logging和窗口的类。
如果你不明白告诉我,我会试着更清楚
答案 3 :(得分:2)
当您将方法声明为“静态”时,您说它不依赖于它所在类的特定实例。
例如,如果您有一个名为“chair”的类,并且您想要计算有多少个椅子,那么您将使用静态字段和静态方法来返回该字段的值。
所有椅子的数量与特定椅子无关
在您的情况下,您想要添加静态方法以将项添加到窗体的特定实例。这是不可能的,也没有意义
如果要将项添加到listBox,则必须通过公共方法
所以基本上我所说的是 - 重新思考你正在尝试做什么,有一个很好的解释,为什么你没有成功这样做。