2015-01-07 2 views
0

Я работаю над шаблоном T4, который производит частичные классы на основе существующих частичных классов.Как получить операторы using для класса с помощью EnvDTE?

Иногда сгенерированный код будет ссылаться на типы, используемые из существующей (не сгенерированной) кодовой базы.

Сгенерированный код должен либо полностью квалифицировать эти типы, либо имитировать операторы using, которые он находит в незагенерированном коде.

Подражая using заявления кажется лучше, так как она будет поддерживать случаи, когда тип в настоящее время ссылки из [Attribute(typeof(Something))], где EnvDTE только возвращает строковый литерал "typeof(Something)".

Итак: как найти их с помощью утверждений? Я использую AutomationHelper материальных активов Т4, но до сих пор не могу найти решение :(

ответ

2

Вы можете получить, используя операторы, посмотрев на FileCodeModel.CodeElements для ProjectItem.

Каждый 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 и общественного класса Class1 части вам нужно будет делать больше работы и посмотреть на членов CodeNamespace с момента CodeImports не будет доступен непосредственно из FileCodeModel.CodeElements, но, надеюсь, вышеуказанный код должен указывать на вас в правильном направлении.