Par le passé, je créais mes propres délégates pour chaque évenement à lancer. Puis, je me suis mis a utiliser EventHandler<T>, mais ça c'est vite avéré pénible, car je devais créer mes propres Class qui dérivaient de EventArgs a chaque fois. J'ai alors trouvé une ressemblance frappante entre mes différentes sous-classes dérivant d'EventArgs. Souvent je n'ai besoin que d'un ou 2 paramètres. J'ai donc créer des classes génériques répondant a environ 90% de mes besoins niveau EventArgs.
Voici les 3 classes avec une classe de démonstration d'utilisation
Source / Exemple :
using System;
using System.IO;
using System.Windows.Forms;
using System.Linq;
namespace UtilityLib
{
/// <summary>
/// EventArgs avec un param d'un type quelconque (Key)
/// </summary>
/// <typeparam name="TKey"></typeparam>
public class KeyEventArgs<TKey> : EventArgs
{
private TKey m_Key;
public TKey Key { get { return m_Key; } }
public KeyEventArgs(TKey key)
{
m_Key = key;
}
}
/// <summary>
/// EventArgs avec un param d'un type quelconque (Key) et un autre param d'un type quelconque (Value)
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TValue"></typeparam>
public class KeyValueEventArgs<TKey, TValue> : EventArgs
{
private TKey m_Key;
private TValue m_Value;
public TKey Key { get { return m_Key; } }
public TValue Value { get { return m_Value; } }
public KeyValueEventArgs(TKey key, TValue value)
{
m_Key = key;
m_Value = value;
}
}
/// <summary>
/// EventArgs avec un param d'un type quelconque (Key) et d'autres params d'un type quelconque (Values)
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TValue"></typeparam>
public class KeyValuesEventArgs<TKey, TValue> : EventArgs
{
private TKey m_Key;
private TValue[] m_Values;
public TKey Key { get { return m_Key; } }
public TValue[] Values { get { return m_Values; } }
public KeyValuesEventArgs(TKey key, params TValue[] values)
{
m_Key = key;
m_Values = values;
}
}
/*
- SIMULATION D'UTILISATION
- /
class ClassSimulation
{
public event EventHandler<KeyEventArgs<string>> MessagePopped;
public event EventHandler<KeyValueEventArgs<Control, bool>> VisibilityChanged;
public event EventHandler<KeyValuesEventArgs<StreamWriter, int>> SumRequested;
private StreamWriter fi;
private Control co;
public ClassSimulation()
{
fi = new StreamWriter("test.txt");
Control co = new Button();
}
public void SimuleChangeVisibility()
{
if (VisibilityChanged != null)
VisibilityChanged(this, new KeyValueEventArgs<Control, bool>(co, co.Visible));
}
public void SimuleMessageArrived(string s)
{
if (MessagePopped != null)
MessagePopped(this, new KeyEventArgs<string>(s));
}
public void SimuleAsk2Nbs(int a, int b)
{
if (SumRequested != null)
SumRequested(this, new KeyValuesEventArgs<StreamWriter, int>(fi, a, b));
}
public void SimuleAsk8Nbs(int a, int b, int c, int d, int e, int f, int g, int h)
{
if (SumRequested != null)
SumRequested(this, new KeyValuesEventArgs<StreamWriter, int>(fi, a, b, c, d, e, f, g, h));
}
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
ClassSimulation c = new ClassSimulation();
c.MessagePopped += new EventHandler<KeyEventArgs<string>>(c_MessagePopped);
c.SumRequested += new EventHandler<KeyValuesEventArgs<StreamWriter, int>>(c_SumRequested);
c.VisibilityChanged += new EventHandler<KeyValueEventArgs<Control, bool>>(c_VisibilityChanged);
//Simulation
c.SimuleAsk2Nbs(2, 7);
c.SimuleChangeVisibility();
c.SimuleMessageArrived("MessageArrived");
c.SimuleChangeVisibility();
c.SimuleAsk8Nbs(1, 2, 3, 4, 5, 6, 7, 8);
}
static void c_VisibilityChanged(object sender, KeyValueEventArgs<Control, bool> e)
{
Console.WriteLine("Visibility of {0} changed to {1}", e.Key, e.Value);
}
static void c_SumRequested(object sender, KeyValuesEventArgs<StreamWriter, int> e)
{
string res = String.Format("La somme de tous les nombres donne {0}", e.Values.Sum());
Console.WriteLine(res);
e.Key.WriteLine(res);
}
static void c_MessagePopped(object sender, KeyEventArgs<string> e)
{
Console.WriteLine(e.Key);
}
}
}
Conclusion :
KeyEventArgs<TKey> : Un paramètre
KeyValueEventArgs<TKey,TValue> : Deux parametres, de deux types pouvant différés
KeyValuesEventArgs<TKey,TValue> : Un nombre >=2 paramètres, étant tous du même types sauf le premier qui peut différer.