2014-03-03 59 views
6

我使用T4實現了一些相當直接的代碼生成,但是當涉及到Property生成的細節時,我遇到了一個基本問題。當我訪問我想要生成的CodeProperty對象的Type屬性時,它們返回'System .__ ComObject'而不是實際的屬性類型。在T4模板中從CodeProperty中檢索屬性類型

我正在使用EnvDTE來查找包含我的自定義屬性的項目中的所有類。我使用這個標記來生成代碼。到現在爲止還挺好。然後我遍歷所有的CodeElement對象,這些對象是我的類的子對象。我可以找到所有的屬性,只是我無法獲得它們的'類型'。

這裏是我的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; } 

<# 
    } 
    } 
} 
#> 

和輸出的一個樣本:

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

正如你所看到的,我親近的有效輸出,它只是類型我正在努力訪問的財產。

回答

8

看着文檔,我嫌疑人你想AsString而不是ToString()。這將呼叫CodeTypeRef.AsString

AsString返回被建模語言中CodeTypeRef的字符串表示形式。例如,如果vsCMTypeRef類型是vsCMTypeRefInt,那麼字符串對於Visual C#將是「Int」,對於Visual Basic是「Long」。

我沒寫過這種代碼自己,所以我只是用文件去,但它是值得一試:)

+0

的伎倆:) EnvDTE顯然是一個有用的工具,它打開但它並不是最直觀的圖書館。 –

+0

幫助我呢!一個小提示:AsString是一個屬性而不是方法。 –

+0

@Dave:謝謝 - 編輯。 –