无参数构造无构造函数类(来自另一个程序集)

本文关键字:另一个 程序集 参数 构造函数 | 更新日期: 2023-09-27 17:58:00

我有一个来自NuGet包的类:

using System.Windows.Forms;
namespace FMUtils.KeyboardHook
{
    public class KeyboardHookEventArgs
    {
        public bool isRShiftPressed { get; }
        public bool isRWinPressed { get; }
        public bool isShiftPressed { get; }
        public bool isWinPressed { get; }
        public Keys Key { get; }
        public override string ToString();
    }
}

它在一个组件中,然后被这个引用:

using System;
using System.Windows.Forms;
using FMUtils.KeyboardHook;
namespace SpeedyGonzales
{
    public class MyClass
    {   
        public MyClass()
        {
            var key = new KeyboardHookEventArgs();
        }
    }
}

这在编译时中断,给我一个错误:

"KeyboardHookEventArgs"不包含采用0的构造函数自变量

现在我发现了几个关于这个问题的东西:

  1. 每个类都需要一个构造函数
  2. 如果没有显式提供任何构造函数,则会调用直接父级的无参数构造器
  3. 如果父级没有这样的构造函数,则会引发错误

这似乎是我的情况,但由于我的类没有从任何东西继承,这意味着唯一的直接父级是..对象?对象没有无参数构造函数吗?请澄清。

无参数构造无构造函数类(来自另一个程序集)

问题中显示的源代码与NuGet包中的源代码不匹配。KeyboardHookEventArgs类实际上包含一个接受参数的构造函数。此构造函数的签名如下所示:

internal KeyboardHookEventArgs(FMUtils.KeyboardHook.Hook.KBDLLHOOKSTRUCT lParam)

构造函数被标记为internal,即它在包含声明的程序集之外不可见(这就是为什么您可能在Visual Studio中没有看到它)。因此,您不能直接在代码中创建KeyboardHookEventArgs类型的对象。这很可能是该库的作者想要的(因为他明确地将构造函数声明为内部的)。

预期用途是使用Hook类来创建钩子。如您所见,KeyboardHookEventArgs类型的对象随后由Hook类创建,并作为事件处理程序的参数传递给您的代码:

var KeyboardHook = new Hook("Global Action Hook");
KeyboardHook.KeyDownEvent += KeyDown;
// Also: KeyboardHook.KeyUpEvent += KeyUp;
private void KeyDown(KeyboardHookEventArgs e)
{
    // handle keydown event here
    // Such as by checking if e (KeyboardHookEventArgs) matches the key you're interested in
    if (e.Key == Keys.F12 && e.isCtrlPressed)
    {
        // Do your magic...
    }
}