[C#] Ajouter des gestionnaires d'événements en utilisant la réflexion


Answers

Voici un brouillon d'une solution de travail:

    protected void Page_Load(object sender, EventArgs e)
    {
        Control ctrl = this.LoadControl("WebUserControl1.ascx");
        PropertyInfo propertyInfo = typeof(Control).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance);
        EventHandlerList eventHandlerList = propertyInfo.GetValue(ctrl, new object[]{}) as EventHandlerList;
        FieldInfo fieldInfo = typeof(Control).GetField("EventLoad", BindingFlags.NonPublic | BindingFlags.Static);

        if(fieldInfo == null)
            return;

        object eventKey = fieldInfo.GetValue(ctrl);
        Delegate eventHandler = eventHandlerList[eventKey] as Delegate;

        foreach(EventHandler item in eventHandler.GetInvocationList()) {
            ctrl.Load -= item;
        }

        ctrl.Load += ctrl_Load;
        foreach (EventHandler item in eventHandler.GetInvocationList()){
            ctrl.Load += item;
        }
        ctrl.Load += ctrl_Load;

        this.Controls.Add(ctrl);
    }

    void ctrl_Load(object sender, EventArgs e)
    {
        //throw new NotImplementedException();
    }
}
Question

J'ajoute dynamiquement des contrôles à la page en utilisant LoadControl et Controls.Add. Je dois d'une manière ou d'une autre encapsuler les gestionnaires d'événements Init et Load de ces contrôles chargés dans mon code. Donc, il devrait être un tel ordre d'événements SomeMyCode () -> Control.Init () -> AnotherMyCode () et la même chose pour Load SomeMyCode () -> Control.Load () -> AnotherMyCode () .
Mon idée était d'obtenir les gestionnaires d'événements de List of Control pour les événements Init et Load et d'ajouter les premier et dernier gestionnaires d'événements avec le code que je devais exécuter. Mais je ne peux pas comprendre comment faire cela.




Links