Vous avez besoin pour mettre en œuvre les ajouter et supprimer des accesseurs sur l'événement, puis vérifier la liste des cibles du délégué, ou de stocker les cibles dans une liste.
Dans la méthode add, vous pouvez utiliser le Délégué.GetInvocationList méthode pour obtenir une liste des cibles déjà ajouté le délégué.
Depuis les délégués sont définis pour comparer l'égalité s'ils sont liés à la même méthode sur le même objet cible, vous pourriez probablement courir à travers la liste et de les comparer, et si vous trouvez aucun qui compare l'égalité, vous ajoutez la nouvelle.
Voici un exemple de code, le compiler comme l'application de la console:
using System;
using System.Linq;
namespace DemoApp
{
public class TestClass
{
private EventHandler _Test;
public event EventHandler Test
{
add
{
if (_Test == null || !_Test.GetInvocationList().Contains(value))
_Test += value;
}
remove
{
_Test -= value;
}
}
public void OnTest()
{
if (_Test != null)
_Test(this, EventArgs.Empty);
}
}
class Program
{
static void Main()
{
TestClass tc = new TestClass();
tc.Test += tc_Test;
tc.Test += tc_Test;
tc.OnTest();
Console.In.ReadLine();
}
static void tc_Test(object sender, EventArgs e)
{
Console.Out.WriteLine("tc_Test called");
}
}
}
Sortie:
tc_Test called
(ie. une seule fois)