Laden...

Per Reflection eine Before- und Afer-Action in eine externe Methode einfügen

Erstellt von Curse4Life vor 12 Jahren Letzter Beitrag vor 12 Jahren 969 Views
C
Curse4Life Themenstarter:in
452 Beiträge seit 2005
vor 12 Jahren
Per Reflection eine Before- und Afer-Action in eine externe Methode einfügen

Hi,

Ich habe wieder eine Idee und wieder muss ich erst mal fragen ob das mit C# 4 Boardmitteln überhaupt möglich ist.

Sagen wir ich habe eine Klasse aus einer externen DLL die nicht von mir ist (Um klar zu machen, ich habe keine Möglichkeit die Klasse zu verändern).

Diese sieht so aus:


public class Test
{
    public String HalloWelt()
    {
        File.WriteAllText("...", "Hallo Welt");
    }
}

So, was ich jetzt gerne tun möchte, so fern möglich, ich würde gerne per Reflection einen BeforeExecute und einen AfterExecute Event hinzufügen.

Also sprich, sagen wir, ich habe eine Zweite Klasse


public class Test2
{
    public void Before()
    {
        Console.WriteLine("Before");
    }

    public void After()
    {
        Console.WriteLine("After");
    }
}

Und jetzt möchte ich jedes Mal bevor Test.HalloWelt() ausgeführt wird Test2.Before() ausführen und danach eben Test2.After().

Und diese Events müssten auch noch per Reflection gebunden werden, weil ich das ganze zur Laufzeit mache.

Ich denke nicht das das möglich ist, aber ich dachte ich frage mal 😃

Grüße und schönes Wochenende

795 Beiträge seit 2006
vor 12 Jahren

Hi,

Kannst du dir nicht einfach einen Proxy bauen?

class MyClass {
    void DoSomething() { Console.WriteLine("DoSomething"); }
}

class MyClassProxy {
    MyClass m_Instance = new MyClass();

    event EventHandler BeforeExecute;
    event EventHandler AfterExecute;

    void DoSomething() {
        BeforeExecute(this, EventArgs.Empty);
        m_Instance.DoSomething();
        AfterExecute(this, EventArgs.Empty);
    }
}

Gruß, Christian.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Curse4Life,

mit Reflection ist das über Umwegen auch möglich. Das Stichwort hierzu ist IL-Rewriting. Suche mal im Forum danach, es gibt ein paar Lösung welche dieses verwenden. Aber die Proxy-Lösung von TheBrainiac ist wesentlich einfacher.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

U
1.688 Beiträge seit 2007
vor 12 Jahren

Hallo,

was genau machst Du "zur Laufzeit" und warum?

Die einfachste Lösung scheint mir hier AOP zu sein, bspw. mit PostSharp. Aber das passiert nicht "zur Laufzeit", sondern als Postprocessor nach dem Kompilieren.