2015-01-07 61 views
0

我正在T4模板上生成基於現有部分類的部分類。如何獲取使用EnvDTE的類的使用語句?

有時生成的代碼將引用從現有(非生成)代碼庫使用的類型。

生成的代碼必須完全限定這些類型,或者模仿非生成代碼中找到的using語句。

模仿using語句似乎更好,因爲它支持從[Attribute(typeof(Something))]引用類型的情況,其中EnvDTE僅返回字符串字面值"typeof(Something)"

所以:我如何找到這些使用語句?我使用的是有形的T4的AutomationHelper,但似乎仍不能找到解決辦法:(

回答

2

您可以通過查看FileCodeModel.CodeElements的項目項獲得using語句。

每個ProjectItem有FileCodeModel屬性。 FileCodeModel.CodeElements將爲每個使用語句包含一個CodeImport。請注意,FileCodeModel.CodeElements將包含其他內容,不僅包含CodeImportss,您需要檢查返回的類型或過濾不需要的類型。

下面顯示了一個示例。在這裏,我使用NuGet的包管理器控制檯和PowerShell。

$p = Get-Project 
$fileCodeModel = $p.ProjectItems.Item("Class1.cs").FileCodeModel 
$fileCodeModel.CodeElements | % { $_.Namespace } 

上面的代碼假定在項目的根目錄中有一個Class1.cs文件。對於每個使用語句,它將打印完整的名稱空間。請注意,在上面的代碼中,它試圖爲每個CodeElement打印命名空間,並且一些元素將不具有此屬性,因此您需要限制它,以便僅查看CodeImport類型。以上將用於以下類文件的工作:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ClassLibrary1 
{ 
    public class Class1 
    { 
    } 
} 

如果您已經使用命名空間ClassLibrary1的,你將需要做更多的工作,並期待在CodeNamespace成員自公共類的Class1部分之間的語句CodeImports將不會直接從FileCodeModel.CodeElements中獲得,但希望上面的代碼能夠指引您正確的方向。