1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| // Introspection des types
foreach (Type monType in canalAssembly.GetTypes())
{
// Si la classe présente dans l'assembly implémente une ICanalGenerique, il s'agit d'un canal
if (monType.GetInterface(typeof(ICanalGenerique).FullName) != null)
{
// On part du principe que tout objet géré par le noyau hérite de ConfigurationSection, ce qui permet de sauvegarder les propriétés dans le app.config
ConfigurationSection monCanal = null;
// Un type correspond, création d'un objet
monCanal = (ConfigurationSection)Activator.CreateInstance(monType);
// On lui colle la section du app.config correspondante
monCanal = (ConfigurationSection)ConfigurationManager.GetSection(monType.Name);
try
{
// Liaison de l'événement à la fonction de traçage
// On fait un appel du style monCanal.RaiseLogEvent += LogSingleton.Instance.AddEntry; mais en utilisant la reflection
// On récupère un pointeur sur l'événement
EventInfo evClick = monType.GetEvent("RaiseLogEvent");
// Puis son type
Type tDelegate = evClick.EventHandlerType;
// On fabrique un handler sur la fonction à lier
MethodInfo myHandler = typeof(GestionLog).GetMethod("AddEntry", BindingFlags.Public | BindingFlags.Instance);
// On crée le délégué sur la fonction à lier
Delegate d = Delegate.CreateDelegate(tDelegate, GestionLog.Instance, myHandler);
// On récupère le pointeur sur la fonction
MethodInfo addHandler = evClick.GetAddMethod();
// Par reflection, on lie le bazard
addHandler.Invoke(monCanal, new Object[] { d });
}
catch
{
GestionLog.Instance.AddEntry(null, new LogEventArgs(TypeLog.Noyau, TypeErreur.Information, "Erreur de liaison du Log au Canal."));
}
// Tentative de lecture
monStream = new MemoryStream();
// Puisqu'on sait qu'il s'agit d'un canal, l'objet doit avoir la methode 'GetData'
// On fait un appel du style monCanal.GetData(ref monStream); mais en utilisant la reflection
bool Result = false;
try
{
Result = (bool)monCanal.GetType().InvokeMember("GetData", BindingFlags.Default | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, monCanal, new object[] { monStream });
}
catch (MissingMethodException mme)
{
// Dans le cas ou la méthode n'est pas un membre de ce type ...
Console.WriteLine("Méthode 'GetData' introuvable : " + mme.Message);
} |
Partager