2014-03-03 6 views
6

Ich implementiere einige ziemlich direkte Codegenerierung mit T4, aber ich stehe auf ein grundlegendes Problem, wenn es um die Details der Eigenschaftsgenerierung geht. Wenn ich auf die Type-Eigenschaft für die CodeProperty-Objekte zugreife, die ich generieren möchte, geben sie anstelle des tatsächlichen Typs der Eigenschaft 'System .__ ComObject' zurück.Abrufen des Eigenschaftstyps aus CodeProperty in T4-Vorlage

Ich verwende EnvDTE, um alle Klassen im Projekt zu finden, die mein benutzerdefiniertes Attribut enthalten. Ich verwende dies, um bestimmte Klassen für die Codegenerierung zu markieren. So weit, ist es gut. Ich gehe dann über alle CodeElement-Objekte, die die Children meiner Klasse sind. Ich kann alle Eigenschaften finden, es ist nur ich kann nicht den "Typ" von ihnen bekommen.

Hier ist ein Ausschnitt aus meinem T4:

public class <#= cls.Name #>_DTO 
{ 
<# 
    foreach (CodeElement child in cls.Children) 
    { 
     if (child.Kind == vsCMElement.vsCMElementProperty) 
     { 
      var prop = child as CodeProperty; 
#> 

    public <#= prop.Type.ToString() + " " + child.Name #> { get; set; } 

<# 
    } 
    } 
} 
#> 

und eine Probe des Ausgangs:

public class TestResult_DTO 
{ 
    public System.__ComObject TestType { get; set; } 
} 

Wie Sie sehen können, ich gültige Ausgabe der Nähe bin, es ist nur die Art von der Immobilie, auf die ich nicht zugreifen kann.

Antwort

8

Blick auf die Dokumente, ich verdächtigen Sie wollen AsString anstelle von ToString(). Das würde nennen CodeTypeRef.AsString:

AsString eine String-Darstellung zurückgeben für die CodeTypeRef in der Sprache modelliert wird. Wenn beispielsweise der vsCMTypeRef-Typ vsCMTypeRefInt ist, lautet die Zeichenfolge "Int" für Visual C# und "Long" für Visual Basic.

Ich habe noch nie diese Art von Code geschrieben ich so dass ich nur durch die Dokumentation zu gehen, aber es ist ein Versuch wert :)

+0

den Trick Hat :) EnvDTE ist offensichtlich ein nützliches Werkzeug, es öffnet up tolle Sachen, aber es ist nicht die intuitivste Bibliothek zu springen. –

+0

Hat mir auch geholfen! Eine kleine Anmerkung: AsString ist eine Eigenschaft und keine Methode. –

+0

@Dave: Danke - bearbeitet. –

Verwandte Themen