В настоящее время я пытаюсь написать функцию расширения, чтобы можно было легко прикрепить действие, которое используется только один раз, когда событие запускается, а затем отписывается.
Я пытаюсь что-то вроде этого:
public static void AttachOnce<TEventArgs>([NotNull] this EventHandler<TEventArgs> me, [NotNull] Action<object, TEventArgs> action)
where TEventArgs : System.EventArgs
{
var handler = me;
EventHandler<TEventArgs> wrappedAction = null;
wrappedAction = (sender, args) =>
{
action(sender, args);
handler -= wrappedAction;
};
handler += wrappedAction;
}
Но ReSharper жалуется на отказ от подписки, что handler
означает «Доступ к измененному закрытию» .
Я знаю, что это значит, поэтому я сделал локальную переменную длязакрытие уже, но это, кажется, не решает это.Что здесь не так?
Прямой жесткий код работает.Примерно так:
var file = new FileSystemWatcher("path/to/file");
FileSystemEventHandler handler = null;
handler = (sender, args) =>
{
// My action code here
file.Changed -= handler;
};
file.Changed += handler;
РЕДАКТИРОВАТЬ 1 (2018-10-09 11:43 CET):
Возможно, я просто слишком быстро задал вопрос, прежде чем тщательно его обдумать.
Вы не можете создавать методы расширения для событий.Совсем.Это просто невозможно в C #.Поэтому я даже не могу проверить, почему ReSharper жалуется, и если это правильно, потому что такой вызов, как file.Changed.AttachOnce(action)
, недопустим. «Событие« Изменено »может появиться только в левой части + = или - =» .
Я нашел еще несколько источников для похожих запросов / вопросов:
http://www.hardkoded.com/blog/csharp-wishlist-extension-for-events
Одноразовый общий вызов события?