Метод Remove
Delegate.Remove принимает текущую цепочку
и делегат, который нужно убрать. Результат
имеет тип Delegate - его снова приводят
к Action
или к своему типу. Если в цепочке остаётся
один метод, при вызове выполняется только он.
Синтаксис
Action left = (Action)Delegate.Remove(chain, toDrop);
left();
Пример
Давайте уберём первый метод из цепочки Action:
using System;
class Program
{
static void First()
{
Console.Write("1");
}
static void Second()
{
Console.Write("2");
}
static void Main()
{
Action a = First;
Action b = Second;
Action chain = (Action)Delegate.Combine(a, b);
Action left = (Action)Delegate.Remove(chain, a);
left();
}
}
Результат выполнения кода:
"2"
Пример
Давайте снимем второй обработчик и оставим первый:
using System;
class Program
{
static void First()
{
Console.WriteLine("abcde");
}
static void Second()
{
Console.WriteLine("12345");
}
static void Main()
{
Action a = First;
Action b = Second;
Action chain = (Action)Delegate.Combine(a, b);
Action left = (Action)Delegate.Remove(chain, b);
left();
}
}
Результат выполнения кода:
"abcde"
Пример
Давайте применим Remove к пользовательскому делегату:
using System;
delegate void StepHandler();
class Program
{
static void StepA()
{
Console.Write("a");
}
static void StepB()
{
Console.Write("b");
}
static void Main()
{
StepHandler a = StepA;
StepHandler b = StepB;
StepHandler chain = (StepHandler)Delegate.Combine(a, b);
StepHandler left = (StepHandler)Delegate.Remove(chain, a);
left();
}
}
Результат выполнения кода:
"b"
Смотрите также
-
Combine,
который собирает цепочку делегатов -
GetInvocationList,
который показывает все звенья цепочки -
мультикаст,
который описывает несколько целей у делегата -
event,
где подписки часто снимают через-=