Dans plusieurs de mes projets, il devient évident que j'ai besoin de quelque chose d'un peu plus puissant que les événements standard .NET. Fondamentalement, je veux l'option de dans une pompe de message, ayant des rappels (événements) élevés à des abonnés spécifiques lorsque le composant qu'ils sont intéressés change. Cela peut être un état de changement d'E/S spécifique (par exemple, un contact de fermeture de bouton) pour un projet, ou un message reçu d'un Ethernet sans fil pour une adresse MAC spécifique dans un autre.Abonnement à un événement adressé
Ma ligne de pensée actuelle est d'utiliser un dictionnaire, et la liste des délégués pour chaque adresse (pour cet exemple).
Je ne l'ai pas encore débogué mais est le suivant dans le bon sens?
class CustomSubscription
{
public delegate void DataReceivedHandler(object sender, DataReceivedEventArgs args);
public class DataReceivedEventArgs : EventArgs
{
public byte[] data;
}
private readonly Dictionary<int, List<DataReceivedHandler>> _subscribers;
public CustomSubscription()
{
_subscribers = new Dictionary<int, List<DataReceivedHandler>>();
}
public void AddSubscriber(int address, DataReceivedHandler callback)
{
if (false == _subscribers.ContainsKey(address))
{
_subscribers.Add(address, new List<DataReceivedHandler>());
}
_subscribers[address].Add(callback);
}
public void RemoveSubscriber(int address, DataReceivedHandler callback)
{
if (false == _subscribers.ContainsKey(address))
{
return;
}
if (_subscribers[address].Contains(callback))
{
_subscribers[address].Remove(callback);
}
}
public void HandleIncommingData(int address, object sender, byte[] payload)
{
if (false == _subscribers.ContainsKey(address))
{
// Nothing subscribed - take no action
return;
}
// Raise callbacks with all subscribers
foreach (DataReceivedHandler callback in _subscribers[address])
{
callback(sender, new DataReceivedEventArgs
{
data = payload
});
}
}
}
http://wiki.unity3d.com/index.php?title=CSharpMessenger_Extended – I4V
-t-il pas un abonné à restreindre par type d'événement? Je veux avoir la possibilité d'avoir plusieurs parties intéressées pour un type d'événement (que mon extrait permette) – l33tmike
Non. Voir l'exemple 'Messenger .Broadcast (" vitesse changée ", vitesse);' Mot-clé ici est le 'Broadcast' –
I4V