无参数构造无构造函数类(来自另一个程序集)
本文关键字:另一个 程序集 参数 构造函数 | 更新日期: 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的构造函数自变量
现在我发现了几个关于这个问题的东西:
- 每个类都需要一个构造函数
- 如果没有显式提供任何构造函数,则会调用直接父级的无参数构造器
- 如果父级没有这样的构造函数,则会引发错误
这似乎是我的情况,但由于我的类没有从任何东西继承,这意味着唯一的直接父级是..对象?对象没有无参数构造函数吗?请澄清。
问题中显示的源代码与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...
}
}