/// <summary>Returns the invocation list of this multicast delegate, in invocation order.</summary> /// <returns>An array of delegates whose invocation lists collectively match the invocation list of this instance.</returns> /// <exception cref="T:System.MemberAccessException">Cannot create an instance of an abstract class, or this member was invoked with a late-binding mechanism. </exception> /// <filterpriority>2</filterpriority> public sealed override Delegate[] GetInvocationList() { MulticastDelegate multicastDelegate = (MulticastDelegate)this.Clone(); multicastDelegate.kpm_next = null; while (multicastDelegate.prev != null) { multicastDelegate.prev.kpm_next = multicastDelegate; multicastDelegate = multicastDelegate.prev; } if (multicastDelegate.kpm_next == null) { MulticastDelegate multicastDelegate2 = (MulticastDelegate)multicastDelegate.Clone(); multicastDelegate2.prev = null; multicastDelegate2.kpm_next = null; return(new Delegate[] { multicastDelegate2 }); } ArrayList arrayList = new ArrayList(); while (multicastDelegate != null) { MulticastDelegate multicastDelegate3 = (MulticastDelegate)multicastDelegate.Clone(); multicastDelegate3.prev = null; multicastDelegate3.kpm_next = null; arrayList.Add(multicastDelegate3); multicastDelegate = multicastDelegate.kpm_next; } return((Delegate[])arrayList.ToArray(typeof(Delegate))); }
/// <summary>Combines this <see cref="T:System.Delegate" /> with the specified <see cref="T:System.Delegate" /> to form a new delegate.</summary> /// <returns>A <see cref="T:System.Delegate" /> that is the new root of the <see cref="T:System.MulticastDelegate" /> invocation list.</returns> /// <param name="follow">The delegate to combine with this delegate. </param> /// <exception cref="T:System.MemberAccessException">Cannot create an instance of an abstract class, or this member was invoked with a late-binding mechanism. </exception> protected sealed override Delegate CombineImpl(Delegate follow) { if (base.GetType() != follow.GetType()) { throw new ArgumentException(Locale.GetText("Incompatible Delegate Types.")); } MulticastDelegate multicastDelegate = (MulticastDelegate)follow.Clone(); multicastDelegate.SetMulticastInvoke(); MulticastDelegate multicastDelegate2 = multicastDelegate; for (MulticastDelegate multicastDelegate3 = ((MulticastDelegate)follow).prev; multicastDelegate3 != null; multicastDelegate3 = multicastDelegate3.prev) { multicastDelegate2.prev = (MulticastDelegate)multicastDelegate3.Clone(); multicastDelegate2 = multicastDelegate2.prev; } multicastDelegate2.prev = (MulticastDelegate)this.Clone(); multicastDelegate2 = multicastDelegate2.prev; for (MulticastDelegate multicastDelegate3 = this.prev; multicastDelegate3 != null; multicastDelegate3 = multicastDelegate3.prev) { multicastDelegate2.prev = (MulticastDelegate)multicastDelegate3.Clone(); multicastDelegate2 = multicastDelegate2.prev; } return(multicastDelegate); }
/// <summary>Removes an element from the invocation list of this <see cref="T:System.MulticastDelegate" /> that is equal to the specified delegate.</summary> /// <returns>If <paramref name="value" /> is found in the invocation list for this instance, then a new <see cref="T:System.Delegate" /> without <paramref name="value" /> in its invocation list; otherwise, this instance with its original invocation list.</returns> /// <param name="value">The delegate to search for in the invocation list. </param> /// <exception cref="T:System.MemberAccessException">Cannot create an instance of an abstract class, or this member was invoked with a late-binding mechanism. </exception> protected sealed override Delegate RemoveImpl(Delegate value) { if (value == null) { return(this); } MulticastDelegate multicastDelegate2; MulticastDelegate multicastDelegate = MulticastDelegate.KPM((MulticastDelegate)value, this, out multicastDelegate2); if (multicastDelegate == null) { return(this); } MulticastDelegate multicastDelegate3 = null; MulticastDelegate result = null; for (MulticastDelegate multicastDelegate4 = this; multicastDelegate4 != multicastDelegate; multicastDelegate4 = multicastDelegate4.prev) { MulticastDelegate multicastDelegate5 = (MulticastDelegate)multicastDelegate4.Clone(); if (multicastDelegate3 != null) { multicastDelegate3.prev = multicastDelegate5; } else { result = multicastDelegate5; } multicastDelegate3 = multicastDelegate5; } for (MulticastDelegate multicastDelegate4 = multicastDelegate2; multicastDelegate4 != null; multicastDelegate4 = multicastDelegate4.prev) { MulticastDelegate multicastDelegate6 = (MulticastDelegate)multicastDelegate4.Clone(); if (multicastDelegate3 != null) { multicastDelegate3.prev = multicastDelegate6; } else { result = multicastDelegate6; } multicastDelegate3 = multicastDelegate6; } if (multicastDelegate3 != null) { multicastDelegate3.prev = null; } return(result); }