Vous devez implémenter les accesseurs ajouter et supprimer sur l'événement, puis vérifier la liste cible du délégué, ou stocker les cibles dans un liste.
Dans la méthode add, vous pouvez utiliser la méthode Delegate.GetInvocationList pour obtenir la liste des cibles déjà ajoutées au délégué. Puisque les délégués sont définis pour comparer des égales s'ils sont liés à la même méthode sur le même objet cible, vous pouvez probablement parcourir cette liste et comparer, et si vous n'en trouvez aucun qui soit égal, vous ajoutez le nouveau .
est ici exemple de code, la compilation en application 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
(c.-à-une seule fois.)
Vous devez utiliser le System.Linq en utilisant. –
Juste pour clarifier le commentaire de Hermann; vous devez inclure l'espace de noms 'System.Linq' en ajoutant 'using System.Linq' à votre classe ou à votre espace de noms actuel. –
Fascinant. LINQ est encore assez nouveau pour moi que je dois le rechercher et être rappelé cela signifie Language Integrated Query ... puis se demander ce que cela a à voir avec EventHandlers et leur InvocationList? – fortboise