Могу ли я определить делегата, его экземпляр и код в одной строке в C #? - PullRequest
0 голосов
/ 11 апреля 2019

В настоящее время, чтобы определить перехват событий, я пишу:

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 имени (WinEventHookDelegate, WindowEventHookInstance, WindowEventHook), 2 дубликата объявления прототипа и 1 присваивание, чтобы получить только указатель на функцию.

Могу ли я написать его менее избыточным и короче, может быть, в одну строку?

1 Ответ

0 голосов
/ 18 апреля 2019

Вы можете использовать делегаты C # вместо определения своих собственных.

Для делегатов, которые указывают на недействительные функции, такие как в вашем случае, вы можете использовать Action.

Вместо того, чтобы объявлять и создавать экземпляр делегата (или, в данном случае, делегата Action), вы можете вставить его непосредственно в ваш метод SetWinEventHook, как этот.Компилятор позаботится об инстанцировании.

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 и передатьв лямбда-выражении или в функции, написанной в другом месте, чтобы ваш делегат указывал на нее.

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

     },
      new IntPtr(), 1, new IntPtr(), 2,3,4,5
     );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...