È necessario implementare l'aggiunta e rimuovere gli utenti dall'evento, quindi controllare l'elenco di destinazione del delegato o archiviare gli obiettivi in un elenco.
Con il metodo add, è possibile utilizzare il metodo Delegate.GetInvocationList per ottenere un elenco degli obiettivi già aggiunti al delegato.
Poiché i delegati sono definiti per essere uguali se sono collegati allo stesso metodo sullo stesso oggetto di destinazione, è probabile che si possa scorrere l'elenco e confrontarsi, e se non si trova nessuno che sia uguale, si aggiunge quello nuovo .
Ecco il codice di esempio, compilare come applicazione 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");
}
}
}
uscita:
tc_Test called
(cioè solo una volta.)
fonte
2009-06-01 22:54:42
È necessario utilizzare System.Linq utilizzando. –
Giusto per chiarire il commento di Hermann; devi includere lo spazio dei nomi 'System.Linq' aggiungendo 'using System.Linq' alla tua classe o spazio dei nomi corrente. –
Affascinante. LINQ è ancora abbastanza nuovo per me da doverlo cercare e ricordare che significa Language Integrated Query ... e poi chiedersi che cosa ha a che fare con EventHandlers e la loro InvocationList? – fortboise