Laden...

Properties von DynamicObject in IntelliSense anzeigen (stehen zur Designtime in XML-Datei)

Erstellt von ..Heinz.. vor 12 Jahren Letzter Beitrag vor 12 Jahren 5.150 Views
.
..Heinz.. Themenstarter:in
134 Beiträge seit 2009
vor 12 Jahren
Properties von DynamicObject in IntelliSense anzeigen (stehen zur Designtime in XML-Datei)

Hallo,

ich habe eine Klasse, die von DynamicObject erbt. Zur Design-Time kann ich einer Instanz der Klasse neue Felder, Properties usw. hinzufügen und Zur Laufzeit über Dictionary.

Nun meine Frage, ist es möglich, in Konstruktor z.B. eine XML-Datei mit den Feldern und Properties, die in die Instanz kommen sollen, zu übergeben, dass ich sie zur Design-Time angezeigt bekomme?

Beispiel:
DynamicClass _dynamicClass = new DynamicClass(Pfad zur XML-Datei)

Vielen Dank im Voraus

F
10.010 Beiträge seit 2004
vor 12 Jahren

Warum meinst du sowas machen zu wollen?
DynamicObject ist eigentlich im COM Umfeld gedacht gewesen, nicht um damit "Option strict = Off" zu machen.

.
..Heinz.. Themenstarter:in
134 Beiträge seit 2009
vor 12 Jahren

Es geht mir nicht darum, dass es mit einem DynamicObject umgesetzt werden muss. Mich würde es nur interessieren, ob esüberhaupt möglich ist, in der design-time solche Veränderungen durchführen zu können.

F
10.010 Beiträge seit 2004
vor 12 Jahren

Welche Designzeit meinst du denn?

B
387 Beiträge seit 2005
vor 12 Jahren

Hi,

du musst halt in deiner abgeleiteten Klasse selbst einen Konstruktur schreiben, der die Variablen am Objekt setzt. Ist doch kein Problem, oder?

So ganz den Durchblick habe ich aber auch nicht, was genau du mit Laufzeit und design-Time meinst...

Gruß
Roland

.
..Heinz.. Themenstarter:in
134 Beiträge seit 2009
vor 12 Jahren

Danke fürdie Antworten.

Mit design-time meine ich zur Entwurfszeit, also in der IDE.

Folgendes,wenn man eine neue Klasse erstellt und die dann Properties bekommt, werden diese Properties in der IntelliSense direkt angezeigt. Ich hätte es nun gerne, dass ich das gleiche machen kann, nur dass ich die Proeprties nicht selbst manuell einfüge, sondern dass diese über eine Konfigurationsdatei autoamtisch geladen werden.

Beispiel
DynamicClass _dynamicClass = new DynamicClass(Pfad zur XML-Datei)
Und wenn ich dann _dynamicClass. mache, hätteich gerne in der IntelliSense alle Properties angezeigt, die in der übergebenen XML-Datei stehen.

B
387 Beiträge seit 2005
vor 12 Jahren

Das geht so nicht über dynamische Objekte, da ja Visual Studio nicht weiß, wie deine xml-datei aussieht und damit schlicht nichts anfangen kann. Der Intellisense zeigt dir nur das an, was in der Klasse definiert ist oder eben gar nichts, wenn du mit dynamic arbeitest.

Gruß
Roland

.
..Heinz.. Themenstarter:in
134 Beiträge seit 2009
vor 12 Jahren

Hallo Roland, danke für deine Antwort 😃

daher auch derverwirrede Titel mit Dynamic. Wenn ich ein Dynamic
_dyn as new ExpandoObject();
erstelle, dann bekomme ich ja imVisual Studio auch die Properties zur Entwurfszeit angezeigt. Wenn ich eine neue Klasseerstelle und dort Properties anlege,sind diese direkt in IntelliSense anzeigbar. Wie wird das intern gemacht? Ich habe bisher noch nichts richtiges zu dem Thema finden können.

S
417 Beiträge seit 2008
vor 12 Jahren

Hallo,

wenn du schon mit Intellisense arbeiten willst, heisst dass dann nicht auch, dass die Properties ja eigentlich schon bekannt sind durch die XML-Datei?
Wäre es dann nicht schlauer, sich anhand der XML-Datei eine Code-Datei zu generieren?
Dann hättest du schon zu Compilezeit vollen Zugriff auf die Member.
In Visual Studio würde sich z.B. ein T4-Skript anbieten, das bei jeder Änderung/Speicherung der XML-Datei, die Code-Generierung anstösst.

.
..Heinz.. Themenstarter:in
134 Beiträge seit 2009
vor 12 Jahren

Hallo Sarc,

T4 funktioniert 😃

Gibt es eine Möglichkeit, dem T4-Script den Dateinamen der XML-Datei als Parameter mitzugeben?

S
417 Beiträge seit 2008
vor 12 Jahren

Hallo,

wenn T4- und XML-Datei im gleichen Ordner liegen und sich im Namen nur durch die Dateierweiterung unterscheiden, kannst du dir im T4-Skript den Pfad wie folgt ermitteln:

var xmlFilename = Path.Combine(Path.GetDirectoryName(this.Host.TemplateFile), Path.GetFileNameWithoutExtension(this.Host.TemplateFile) + ".xml");

Damit das obige klappt, brauchst natürlich noch die entsprechenden imports im T4-Skript, z.B.

<#@ import namespace="System.IO" #>
.
..Heinz.. Themenstarter:in
134 Beiträge seit 2009
vor 12 Jahren

Hallo Sarc,

danke für die schnelle Antwort.

Habe mich etwas unklar ausgedrückt...

Ich habe nun meine Anwendung und meine DLL, in der das T4-Script liegt und die Klasse erzeugt. Ist es nun möglich, dem T4-Script von außerhalb (meine Anwendung aus) den Speicherort der XML-Datei mitzuteilen?

Habe es heraus gefunden.

<#@ parameter type="System.Object" name="Object" #>
S
417 Beiträge seit 2008
vor 12 Jahren

Hallo,

noch verstehe ich nicht ganz was du vorhast.
Normalerweise verwendest du das T4-Skript ja vor dem Kompilieren, um eine Code-Datei anhand deiner XML-Datei zu generieren. Nach dem Kompilieren ist die generierte Klasse dann logischerweise in deiner DLL.
Wenn du dann das T4-Skript separat nochmal ausführen würdest, würde ja nur die Code-Datei neu generiert werden, aber der Inhalt der DLL bliebe unverändert.

Oder wieso möchtest du das T4-Skript von ausserhalb aufrufen?

.
..Heinz.. Themenstarter:in
134 Beiträge seit 2009
vor 12 Jahren

Ich habe vor, mithilfe von T4 ProxyKlassen, ohne Interface zu erstellen. Dafür muss ich die XML-Datei, in der der Aufbau der Klassen hinterlegt ist, auswählen können. Aber mit

<#@ parameter type="System.Object" name="Object" #>

sollte es funktionieren.

S
417 Beiträge seit 2008
vor 12 Jahren

Ok, dann passts ja. Ich hatte gedacht, du hast nur eine XML-Datei.

.
..Heinz.. Themenstarter:in
134 Beiträge seit 2009
vor 12 Jahren

Danke Sarc für die Mithilfe und das Stichwort "T4", das mich dann zum richtigen Vorgehen gebracht hat 😃

.
..Heinz.. Themenstarter:in
134 Beiträge seit 2009
vor 12 Jahren

Mein T4-Script läuft ohne Probleme. Ich habe jetzt nur noch ein Problem mit der Parameterübergabe. Die Deklaration des Parameters im T4-Script ist kein Problem. Ich kann auch damit arbeiten (habe ihn testweise mauell im Script gefüllt). Er wird korrekt ausgelesen und verarbeitet. Nur bekomme ich es nicht ihn, ihn von außerhalb zu füllen. Ich habe diesen Beitrag in MSDN gefunden T4 Parameter, werde jedoch nicht schlau daraus.

Nun meine Frage: Hat schonmal jemand versucht, ein Parameterfeld zu füllen? Wenn ja, wie muss ich vorgehen?

S
417 Beiträge seit 2008
vor 12 Jahren

Wie genau rufst Du das T4-Skript denn auf? über ProcessTemplate() oder über die TextTransform.exe?

.
..Heinz.. Themenstarter:in
134 Beiträge seit 2009
vor 12 Jahren

Hallo Sarc,

ich hoffe, ich kann dir "weiterhelfen". Bin noch Neuling in dem Gebiet. Daher kam ich auch nicht direkt auf T4. Habe damit bisher noch nichts gemacht.

Ich habe das T4-Script (MyClass.tt) und rufe das über

var _myClass = new MyClass

auf. Die "TextTransform.exe" rufe ich nicht auf.

S
417 Beiträge seit 2008
vor 12 Jahren

Hallo,

normalerweise arbeite ich nicht mit Preprocessed T4-Templates und benötige auch keine Parameter. Aber so hat es bei mir jetzt geklappt:

var t = new MyTemplate();
t.Session = new TextTemplatingSession();
t.Session["p1"] = 20; // Name des Parameters ("p1") und Wert (20)
t.Initialize();
var s = t.TransformText();

Im T4-Skript kannst du dann den Parameternamen ganz normal als Variable verwenden.

Du musst allerdings noch folgende Assemblies referenzieren, damit die TextTemplatingSession funktioniert:

  • Microsoft.VisualStudio.TextTemplating.10.0
  • Microsoft.VisualStudio.TextTemplating.Interfaces.10.0

Edit:
Habe grad rausgefunden, dass es sogar noch viel einfacher geht. Und zwar ist die generierte Klasse ja partial, d.h. du kannst dir einfach eine weitere partielle Klassendefinition erstellen, in der du deine Parameter ganz normal deklarierst. Das Skript kann dann später auch auf diese zugreifen, da diese ja auch in der Klasse definiert sind.
Z.B.:

partial class MyTemplate
{
	public int p1;
}
.
..Heinz.. Themenstarter:in
134 Beiträge seit 2009
vor 12 Jahren

Hallo Sarc,

danke für die Mühe, die du dir machst.

Den Code habe ich schon in der MSDN gefunden. Jedoch komme ich an der Stelle "t.Session" nicht weiter.

Wenn ich

var t = new MyTemplate();

schreibe, wir automatisch eine neue Instanz der Klasse erstellt. Aber ich kann nicht auf "Session" zugreifen. Muss ich irgendwo (im T4-Script) "MyTemplate" als Namen hinterlegen?

S
417 Beiträge seit 2008
vor 12 Jahren

Hallo,

nimm doch einfach meine zweite Variante mit der partiellen Klasse. Ich habe dir ein lauffähiges Beispiel (VS-Projekt) beigefügt.

.
..Heinz.. Themenstarter:in
134 Beiträge seit 2009
vor 12 Jahren

Hallo Sarc,

Danke für dein Beispielprojekt 😃

.
..Heinz.. Themenstarter:in
134 Beiträge seit 2009
vor 12 Jahren

Ist es möglich, in einem T4-Script auf eine static variable einer anderen Klasse zuzugreifen? So dass ich die Variable auch aus einer anderen Klasse auslesen kann und nicht aus der partial Klasse?

Ist es möglich, die Variable zu setzen, im T4-Script auszulesen und danach das T4-Script auszuführen?