C# n'est toujours pas assez OO? Ici, je donne un exemple (peut-être mauvais).Traiter les événements comme des objets
public class Program
{
public event EventHandler OnStart;
public static EventHandler LogOnStart = (s, e) => Console.WriteLine("starts");
public class MyCSharpProgram
{
public string Name { get; set; }
public event EventHandler OnStart;
public void Start()
{
OnStart(this, EventArgs.Empty);
}
}
static void Main(string[] args)
{
MyCSharpProgram cs = new MyCSharpProgram { Name = "C# test" };
cs.OnStart += LogOnStart; //can compile
//RegisterLogger(cs.OnStart); // Line of trouble
cs.Start(); // it prints "start" (of course it will :D)
Program p = new Program();
RegisterLogger(p.OnStart); //can compile
p.OnStart(p, EventArgs.Empty); //can compile, but NullReference at runtime
Console.Read();
}
static void RegisterLogger(EventHandler ev)
{
ev += LogOnStart;
}
}
RegisterLogger (cs.OnStart) conduit à compiler une erreur, parce que "Le XXX événement ne peut apparaître sur le côté gauche de + = ou - = blabla". Mais pourquoi RegisterLogger (p.OnStart) peut-il? Pendant ce temps, bien que j'ai enregistré p.OnStart, il va également lancer une exception NullReferenceException, semble que p.OnStart n'est pas "vraiment" passé à une méthode.
Notez que même s'il n'est pas possible de transmettre des "références d'événement", vous pouvez contourner cela en encapsulant tout ce que vous voulez faire avec l'événement dans un délégué. Mon article sur http://powderize.ch/c-event-relays/ explore une application de cette idée pour créer un relais d'événement. Peut-être que vous pouvez prendre cette idée et l'adapter à vos besoins! – theDmi