我可以在C#的一行中定义委托,它的实例和代码吗?

时间:2019-04-11 17:24:36

标签: c# delegates

当前,要定义事件挂钩,我正在写:

delegate void WinEventHookDelegate(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime);

...

private WinEventHookDelegate WindowEventHookInstance;

...

private void WindowEventHook(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)

...

WindowEventHookInstance = new WinEventHookDelegate(WindowEventHook);
        Install();

...

SetWinEventHook(...
                WindowEventHookInstance,     // lpfnWinEventProc
                ...);

...

即我正在创建3个名称(WinEventHookDelegateWindowEventHookInstanceWindowEventHook),2个重复的原型声明和1个赋值,以仅获得指向函数的指针。

我可以写成更少冗余,更短的文字吗?也许是一行吗?

1 个答案:

答案 0 :(得分:0)

您可以使用C#的委托来代替定义自己的委托。

对于指向无效函数的委托(例如您的案例),可以使用Action。

您可以像这样直接将其粘贴在SetWinEventHook方法中,而不是声明和实例化委托(或在这种情况下为Action委托)。 编译器将负责实例化。

public void SetWinEventHook(Action<IntPtr, uint, IntPtr, int, int, uint, uint> myDelegate)
{

}

现在为了启动您的代表指向您的功能,请执行此操作

myDelegate() 

但是,问题是此委托需要您声明它将需要的7个参数。

为了提供这些信息,您可以像下面这样在SetWinEventHook方法中将它们作为第二个参数传递

 public void SetWinEventHook(Action<IntPtr, uint, IntPtr, int, int, uint, uint> myDelegate, IntPtr a, uint b, IntPtr c, int d, int e, uint f, uint g)
 {
     myDelegate(a,b,c,d,e,f,g);
 }

所以在这一点上您基本上是

1)宣布一名代表

2)实例化一个代表

3)创建了一个钩子方法来启动委托/功能

现在,您所需要做的就是调用SetWinEventHook并传入lambda或传入其他地方编写的函数,以便您的委托人指向它。

     SetWinEventHook((a, b, c, d, r, f, g) => // using lambda here
     {

     },
      new IntPtr(), 1, new IntPtr(), 2,3,4,5
     );