| 

.NET C# Java Javascript Exception

5
Hallo Tüftler und Profis
ich hab mir einen kleinen Mapper geschrieben, der auch super funktioniert und mir eine Menge Tipparbeit abnimmt. Nun will ich den Schreibaufwand noch weiter reduzieren. Folgendes Szenario (auf das wesentliche reduziert):
public class Datenklasse : VClass
{
private string id;

private string status;

public string Id
{
get
{
return this.id;
}
set
{
this.id = value;
this.Dosomething("Id");
}
}

public string Status
{
get
{
return this.status;
}
set
{
this.status = value;
this.Dosomething("Status");
}
}
}

public class VClass
{
internal void Dosomething(string name)
{
Console.WriteLine(name);
}
}


Nun hätte ich gerne, dass es wie folgt aussieht. Hab schon eine Menge über dynamics und Reflection gelesen, aber irgendwie fehlt mir immer genau der Teil (oder ich versteh es einfach nicht!)
public class Datenklasse : VClass
{
public string Id { get; set; }

public string Status { get; set; }
}

public class VClass
{
public VClass()
{
foreach (PropertyInfo pi in this.GetType().GetProperties())
{
// Hier soll nun dynamisch bei der Instanzierung der Datenklasse
// in den Setter der Properties
// Dosomething(pi.Name) eingetragen werden
}
}

internal void Dosomething(string name)
{
Console.WriteLine(name);
}
}

Hierdurch wird die eigentliche Datenklasse wesentlich schlanger und ist nicht so fehleranfällig. PostSharp und Co sind mir einfach zu teuer, bzw können wieder viel mehr, als ich brauche.
Hat jemand evtl ein kleines Stückchen Code für mich? Seh ich den Wald vor lauter bäumen nicht, oder ist es tatsächlich so kompliziert?

Ostergrüsse und Danke im Vorraus
Martin Frank

ps: wann kommt der Frühling?
News:
01.04.2013
BrainyRP 31 2
1 Antwort
3
Ich denke, Du hast hier einige Möglichkeiten, jedoch keine, die in etwa so funktionieren wird, wie Du das in Deinem Codebeispiel dargestellt hast.

Ich versuche, die Varianten nach steigender Komplexität zu ordnen:

  • Template für Productivity-Tool:
    Ob CodeRush oder Resharper oder wie sonst alle heißen, ein Template ist schnell erstellt. Template aufrufen, nur noch Datentyp und Name einfügen und der restliche Code wird vom Template generiert. Spart enrom Schreibarbeit und ist sehr einfach umzusetzen.
  • T4 Template
  • Wenn es nur um das robuste Weitergeben des Strings an eine Methode gehen sollte, dann könnte das CallerMemberName Attibut (ab .NET 4.5) interessant sein. Kürzt aber den Code nicht, macht ihn aber robuster ggü. Renames.
  • Dynamic Language Runtime
    Du leitest Deine Datenklassen von DynamicObject ab, oder baust Dir einen Wrapper, der von DynamicObject ableitet. Damit hast Du dann die Möglichkeit, die Aufrufe an Dein dynamisches Objekt zur Laufzeit abzufangen und Deinen Vorstellungen entsprechend damit zu verfahren. Aufgrund des Late-Bindings hast Du hier aber keine Intellisense Unterstützung mehr.
  • Interface/virtuelle Methoden für Datenklasse und Decorator bzw. Interceptor
    Du spendierst Deinen Datenklassen ein Interface, erzeugst diese nur ncoh über eine Factory, die dafür zuständig ist, mit z.B. Castle DynamicProxy einen Interceptor für das Interface zu generieren und diesen zurückzuliefern.
  • Interface/virtuelle Methoden und Reflection.Emit
    Statt Castle DynamicProxy o.Ä. kannst Du Dir auch den Spass gönnen, das IL mit Reflection.Emit selbst zu generieren. Hat einen klaren Performancevorteil ggü. DynamicProxy, ist aber auch ein wenig komplizierter (vor allem, wenn man es das erste Mal versucht).
  • IL Rewriting im PostBuild-Step
    Du baust Dir ein Tool, das den IL Code von kompilierten Assemblies im Nachgang verändert. Hierfür kannst Du glücklicherweise auf Mono.Cecil setzen. Im Build-Prozess lässt Du dann in einem Post-Build Step dein Tool über die Assemblies laufen und das IL entsprechend verändern.

Das sind meine spontanen Einfälle. Wenn Du zu einzelnen Punkten Unterstützung brauchst, melde Dich einfach nochmal mit einer spezifischeren Frage zum entsprechenden Thema.
02.04.2013
ffordermaier 8,4k 3 9
Danke für die umfangreiche Antwort. Irgendwie komm ich gedanklich immer wieder auf Reflection.Emit, obwohl ich noch keine Ahnung hab, wie ich es umsetzen soll. Ich werd mal ein paar Tests starten. Wenn ich was finde oder ganz verzweifel, dann melde ich mich.
BrainyRP 02.04.2013

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH