Цель вызвать метод один раз и потом удалить это из списка вызовов. Ситуация примерно такая:
public class Test {
public delegate void Handler();
public Handler OnClose;
public void test() { /* 1 */
Handler helper=null;
var f=new Form(); f.Show(); // для примера
helper=()=> { f.Close(); OnClose-=helper; }
OnClose+=h;
}
}
Хочется получить примерно следующее
public static class HandlerExt {
public static void Once(this Handler handler,Handler action) {
Handler helper=null;
helper=()=> { handler-=helper; action(); };
handler+=helper;
}
}
...
OnClose.Once(()=>{ some_action }); /* 2 */
...
К сожалению конструкция /*2*/ не работает так как C# передаёт копии делегатов а не ссылки на них.
Конструкция /*1*/ хоть и работает но очень громоздкая. Нельзя ли как-нибудь конструкцию /*1*/ обернуть в функцию что бы упростить синтаксис?