Вы на самом деле не знаете, что вы удаляете, потому что это не работает как статические события, которые имеют add, удалите, если dlr не видит свойство статического события, он выполняет следующие эквивалентные операции динамически, когда вы делаете+=
и -=
.
//d.MyEvent += new EventHandler(this.MyHandler);
var temp = d.MyEvent; //temp is null
temp += new EventHandler(this.MyHandler) //temp is now MyHandler
d.MyEvent = temp; //set it back
//d.MyEvent -= new EventHandler(this.MyHandler);
var temp = d.MyEvent; //temp is MyHandler
temp -= new EventHandler(this.MyHandler) //temp is now null
d.MyEvent = temp; //set it back
EventHandler является MulticastDelegate, поэтому вы должны рассматривать его как коллекцию, поэтому, если в нем есть только тот обработчик событий, который вы удаляете, свойство set в концедолжен быть нулевым, так как ничего не осталось.Если бы в микс было добавлено больше событий, это было бы более понятным.
//d.MyEvent += new EventHandler(this.MyHandler);
var temp = d.MyEvent; //temp is null
temp += new EventHandler(this.MyHandler) //temp is now MyHandler
d.MyEvent = temp; //set it back
//d.MyEvent += new EventHandler(this.MyHandler2);
var temp = d.MyEvent; //temp is MyHandler
temp += new EventHandler(this.MyHandler2) //temp is now MyHandler,MyHandler2
d.MyEvent = temp; //set it back
//d.MyEvent -= new EventHandler(this.MyHandler);
var temp = d.MyEvent; //temp is MyHandler,MyHandler2
temp -= new EventHandler(this.MyHandler) //temp is now MyHandler2
d.MyEvent = temp; //set it back
Если вам нужно хранить его по-другому и нужно добавить и удалить, то создайте класс хранения, чтобы обернуть ваше поведение и убедиться, что вы вернетесьэто на вашем TryGet.
public DelegateStoreage<T>{
public void Add(T del){
//Do your stuff
}
public void Remove(T del){
//Do your stuff
}
public static T operator +(DelegateStoreage<T> x, T y)
{
x.Add(y)
return x
}
public static T operator -( DelegateStoreage<T> x, T y)
{
x.Remove(y)
return y;
}
}