Laden...

Snippet/Tool um Objektinitialisierer anhand eines Klassennamens/Signatur automatisch zu erstellen

Erstellt von frankywi vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.392 Views
F
frankywi Themenstarter:in
5 Beiträge seit 2010
vor 13 Jahren
Snippet/Tool um Objektinitialisierer anhand eines Klassennamens/Signatur automatisch zu erstellen

Hallo!

Ich arbeite gerade mit WCF und mehreren Web Services und habe daher mit aus einem XML-Schema generierten Typen/Klassen zu tun. Insegesammt handelt es sich um ca. 60 Klassen, die natürlich ineinander verschachtelt sind. Also zum Beispiel:


class Mastertype
{
public string member1;
public string member2;

public Subtype1 memberSubtype1;
public Subtype2 memberSubtype2; 
}

Die Web Services werden zum Datenaustausch genutzt und beim "befüllen" Typen muss dann jede Überklasse und ihre Unterklassen initialisiert werden. Da die Clients antworten, kommt es dort erneut zu einer "Initialisierungsorgie" und da auch noch mehrere unterschiedliche System angebunden sind, wird das noch mehr. Kurzum eine Menge stupider Tipparbeit. Objektinitialisierer verringern die Menge etwas, doch meine Frage ist:

Gibt es nicht einen Weg, anhand einer Klasse bzw. deren Signatur automatisch Code für einen entsprecheneden Objektinitialisierer zu generieren?

Ich dachte eigentlich, soetwas (Tool, Snippet etc.) benötigen viele Leute, oder ich bin zu doof zu googlen, habe aber nichts dergleichen gefunden. Sollte es soetwas nicht geben, wäre es technisch überhaupt machbar soetwas in einem Snippet umzusetzen? Anders gefragt, kann ich in einem Snippet Reflection nutzen?

Für Tipps, Anregungen und Vorschläge bin ich jederzeit Dankbar!

GD

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

wenn ich dich richtig verstanden habe dann schau dir mal T4 an (Code Generation in a Visual Studio Project)

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

F
frankywi Themenstarter:in
5 Beiträge seit 2010
vor 13 Jahren

Hallo gfoidl,

vielen Dank für den schnellen Hinweis. Habe mir das mal durchgelesen, muss aber sagen, das ist nicht ganz das Richtige.

Ich kann zwar ein Template spezifisch für jedeb Typ erstellen oder Code aus einem Modell generiern, aber dynamisch anhand der Klassensignatur geht damit scheinbar nicht.

Meine ideale Vorstellung davon wäre den Klassennamen einzutippen, dann Rechtsklick und den Initialisierer generieren - oder mit Tab und einem Snippet. Und das ganze für alle Klassen sofern sie denn bekannt sind.

156 Beiträge seit 2010
vor 13 Jahren

so etwas suche ich auch scvhon die ganze Zeit, war aber noch nicht erfolgreich...

Wir benutzen momentan Interfaces,die dann leider noch selbst implementiert werden müssen

S
417 Beiträge seit 2008
vor 13 Jahren

Hi,

Ich kann zwar ein Template spezifisch für jedeb Typ erstellen oder Code aus einem Modell generiern, aber dynamisch anhand der Klassensignatur geht damit scheinbar nicht.

Ein solche dynamische Generierung geht in T4 sehr gut. Es ist zwar mit
Programmieraufwand verbunden (anstelle eines "einfachen" Snippets), aber
dafür ist T4 sehr mächtig.
Wenn man es erstmal richtig aufgesetzt hat, dann wird der Folgeaufwand auch geringer.
Du kannst mit T4 beispielsweise alle Type/Interfaces aus der aktuellen Assembly analysieren und darauf basierend, Code generieren.

Zum Spass hab ich mal ein Demo Projekt dazu erstellt, um zu demonstrieren wie man
anhand eines Interfaces, eine abgeleitete Klasse erzeugen kann. (siehe Anhang)
Benötigt wird: VS2010 und T4 Toolbox (http://t4toolbox.codeplex.com/)

Ich würd dir raten, T4 nochmal in Betracht zu ziehen für deine Aufgabe.

Gruß
Daniel

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo Sarc,

super Beispiel 👍

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

F
frankywi Themenstarter:in
5 Beiträge seit 2010
vor 13 Jahren

Hallo!

Vielen Dank erstmal für das Beispiel! Und mea culpa, dass ich t4 so schnell abgetan habe, zu unrecht. Auf MSDN ist nicht direkt ersichtlich das man innerhalb der Templates alle Techniuken die .Net bietet einsetzen kann.

Nach etwas Anpasserei habe ich jetzt ein Template, das für eine Klasse einen Initialisierer erzeugt.

Ich stelle mir jetzt nur die Frage wie man das in den normalen Programmiervorgang einbinden kann . ein snippet führt keinen code / Template aus (ok soweit ich weiß). Ich kann zwar einfach Initialisierer für meine Reference (mit den ganzen zu instanziierenden Klassen) erstellen, aber dynamisch und nicht in einem seperaten File wäre der Feinschliff.

Falls es dazu noch einen Erfahrungsbericht bzw. Tipp gäbe würde ich ihn gerne hören.

Vielen Dank nochmals!

Grüße!

S
417 Beiträge seit 2008
vor 13 Jahren

Hallo,

wenn du nicht den Umweg über ein separates T4 File machen möchtest, dann kannst du
dir natürlich auch ein VS Add-In schreiben, welches den gewünschten Code ausführt.
Aber sooo tragisch ist das ausführen der T4 Datei doch nicht.
Und was genau meinst du eigentlich mit "dynamisch"?

Gruß

F
frankywi Themenstarter:in
5 Beiträge seit 2010
vor 13 Jahren

Hallo!

Ich meine mit dynamisch in dem Fall dynamisch während des Programmierens. Ideal:

  • eintippen des Klassennamens
  • TAB drücken, oder markieren und Kontextmenü Eintrag wählen
  • der Code für einen kompletten Initialisierten Code für diese spezielle Klasse wird erstellt und eingefügt.

Der Umweg über die Datei bedeutet einmal copy and paste, wann immer ich eine Klasse brauche und ich muss im vorhinein das Template laufen lassen. Immernoch besser als den ganzen Code selbst zu tippen, aber nicht so schön.

Grüße!

2.187 Beiträge seit 2005
vor 13 Jahren

Hallo frankywi,

Was ud beschreibst hört sich sehr nach CodeSnippets an.
Du müsstest dir pro Klasse (bzw. pro Variante der Initialisierung) ein Snippet anlegen.
In einem Snippte kannst du dann Platzhalter z.B. für Variablennamen oder Typen einsetzen und noch einiges mehr was ich noch nicht kenne.
Damit sollten deine Wünsche erfüllbar sein.

Gruß
Juy Juka

F
frankywi Themenstarter:in
5 Beiträge seit 2010
vor 13 Jahren

Hallo JuyJuka,

leider habe ich über 60 Klassen am start. Dafür jeweils ein snippet - keine sehr zeitsparende Sache.

Es wäre schön, im snippet selbst dynamisch die Klasse zu reflektieren aber das geht wohl? nicht.

Also gehe ich, sofern keiner eine noch bessere Idee hat, ersteinmal den visual studio add inns nach.

FG

2.187 Beiträge seit 2005
vor 13 Jahren

Hallo frankywi,

Sorry, ich hatte irgend wie die 60 übersehen beim lesen.
Also bevor du dich mit dem AddIn-Framework auseinandersetzen musst (falls du's schon kennst ignorieren den rest vom Post) kannst du auch einfach eine Konsolenanwendungschreiben, die dir die Snippets generiert. 😉
Dann "musst" du halt immer mal wieder dies Anwendung anwerfen, falls es Änderungen gab oder neue Klassen hinzugekommen sind, aber du sparst dir halt das AddIn-Zeug.

Gruß
Juy Juka

S
417 Beiträge seit 2008
vor 13 Jahren

Hallo,

also so einen Shortcut über TAB kann dir T4 nicht ohne VS Add-In liefern.
Es ist aber völlig ausreichend wenn du dir eine T4 bastelst, welche für alle benötigten Klassen den Initialisierer erzeugt. Dadurch entfällt schonmal ein Copy/Paste.
In der T4 Datei musst du entsprechend einen Filter erstellen, für welche Klassen ein Initialisierer erstellt werden soll. Ich kenne dein konkretes Szenario nicht, aber eine
Möglichkeit wäre z.b. die Klassen mit einem Attribute (z.b. [InitGen]) zu annotieren.
T4 würde dann bei jedem Durchlauf all diese Klassen verarbeiten und dafür Initialisierer erzeugen.

Gruß