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

时间:2016-07-20 08:42:02

标签: c# class inheritance

我有这个来自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. 如果父级没有这样的构造函数,则会抛出错误
  4. 这似乎是我的情况,但由于我的类不继承任何东西,这意味着唯一的直接父级是..对象?对象没有无参数构造函数吗?请澄清。

1 个答案:

答案 0 :(得分:3)

问题中显示的源代码与source in the NuGet package不符。 KeyboardHookEventArgs类实际上包含一个带参数的构造函数。此构造函数的签名如下所示:

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

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

intended usage是使用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...
    }
}