c# - 如何从另一个类的静态方法(即只有一个对象)调用实例方法?

标签 c# oop formatting

我的 form1 类包含一堆我需要保存的数据,因此一次只能运行一个它的实例。

public partial class Form1 : Form
{
    public string form1string = "I really need to save this data";

    public Form1()
    {
        InitializeComponent();


        // Even if I pass my form1 object here I still can't access it from
        // the upcoming static methods.
        InterceptKeys hook = new InterceptKeys();
    }

InterceptKeys,这不是我的代码,包含一堆键盘钩子(Hook)所需的静态方法。

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
    if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
    {
       int trueKeyPressed = Marshal.ReadInt32(lParam);

       if (Form1.mirror)
       {
           Form1.newKeyPress(trueKeyPressed);
           return (IntPtr)1;
       }
    }
    return CallNextHookEx(_hookID, nCode, wParam, lParam);
 }

因为 HookCallBack 方法是静态的,所以 Form1.newKeyPress() 也需要是静态的。

但是如果 newKeyPress 处于静态状态,我将无法访问我需要的数据!我不想在这里声明一个新的 form1 对象,因为那样会给我不同版本的数据。正确吗?

我不是面向对象专家。我应该如何格式化它,以确保所有 InterceptKey 的 form1 方法调用都转到我想要的 form1 对象?

谢谢,如果您需要更多信息,请告诉我!

最佳答案

您有两个设计问题:

如何从静态方法调用实例方法

Because the HookCallBack method is static, Form1.newKeyPress() needs to be static as well.

您可以将主窗体的一个实例传递给您的HookCallBack 方法,您只需要向您的静态方法添加一个额外的参数:

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam, Form1 form)
{
   // ...
}

这实际上是首选策略。只要您的方法和类依赖于其他对象,您就应该将依赖项传递到您的方法中,而不是从全局状态中提取它们。

除此之外,您可以循环遍历 Application.OpenForms收集并找到您要查找的表格,如下所示:

var form = Application.OpenForms.OfType<Form1>().First();
form.newKeyPress();

如何同时打开一个表单实例

其他人建议让您的表单静态化——这是一种方法,但这是一种糟糕的方法。静态表单在处理时不会被垃圾回收,当您显示/隐藏表单时,您必须实现自己的初始化/重置方法,如果静态表单引用了其他对象,那么您的应用程序将慢慢泄漏内存,among other things .我实际上推荐这样的东西:

class FormFactory
{
    public Form1 GetForm1()
    {
        return Application.OpenForms.OfType<Form1>().FirstOrDefault ?? new Form1();
    }
}

因此,您的 FormFactory 控制着表单的生命周期,现在您可以使用 new FormFactory.GetForm1() 获取现有的或新的 Form1 实例。

关于c# - 如何从另一个类的静态方法(即只有一个对象)调用实例方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2070481/

相关文章:

xslt - 如何在 xsl :text tags? 之间格式化文本

C# 字符/字节编码相等

c# - 从图像中删除所有水平和垂直线

c# - 使用 jQuery.ajax() 时,HttpListener 仅获取 InputStream 的前 900 个字节

c# - 使用 HttpHandler 重定向子文件夹

c++ - 表示点\位置的类型或 vector

java - 一个单元应该如何测试 hashCode-equals 合约?

oop - 我可以根据参数的数量重载类型绑定(bind)过程吗?

c# - 格式化 C# 输出

java - 在 String.format() 中选择参数