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
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.
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!"
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.