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

C# 无参数构造无构造函数类(来自另一个程序集),c#,class,inheritance,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 { ge

我有一个来自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的构造函数 论据

关于这个问题,我发现了几点:

  • 每个类都需要一个构造函数
  • 如果没有显式提供任何构造函数,则会调用直接父级的无参数构造函数
  • 如果父级没有这样的构造函数,将抛出一个错误

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

    您的问题中显示的源代码与您的答案不匹配。
    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...
        }
    }
    

    public重写字符串ToString()看起来不对劲-这真的可以编译吗?这是一个NuGet包。。用得很好。代码来自给定程序集的内部。为什么看起来不正确?类可能没有任何构造函数-在这种情况下,它将有一个默认的无参数构造函数。看起来你还没有展示完整的代码,这段代码甚至不应该编译。因为它没有主体-你可能从包中反编译了吗?我想你需要重新阅读这个包应该为你做什么。它似乎是用-ie设计的,您不应该试图构造该特定类的实例。