![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Снова шаблоны, EnvDTE.CodeType
Вернемся к шаблонам и изучим то, что такое EnvDTE.CodeType. CodeType – это интерфейс, к которому может быть приведена информация об классе, полученная через Get-ProjectType. Что мы знаем про этот интерфейс. Например, про свойства: · Access – какой это тип, публичный, приватный и т.д.. · Attributes – коллекции атрибутов, связанные с этим типом. · Bases – коллекции классов, из которых этот элемент происходит. · Children – возвращает коллекцию объектов, содержащихся в этом CodeType. · Comment – комментарий относящийся к классу. (Можно сделать автоматическую документацию). · DerivedTypes – Наследуемые типы. Это свойство не поддерживается в Visual C#. · DocComment – Документальный комментарий или атрибут, который выполняет эту роль. · DTE – возвращает главный объект расширения · EndPoint – строка в файле, с которой начинается описание этого класса. · FullName – полное имя, типа System.Int32 · InfoLocation – возвращает возможности объектной модели. · IsCodeType – можно ли CodeType получить из этого объекта. · IsDerivedFrom – возвращает CodeType базового объект. · Kind – свойства типа объекта. · Language – на каком языке это написано. · Members – члены объекта. Вот это очень полезная функция. · Name – имя объекта. · Namespace – пространство имен объекта. · Parent – непосредственный родитель объекта. · ProjectItem – файл объекта. · StartPoint – строка, в которой началось описание объекта.
Есть еще методы, но мы их не используем. Кстати, обратите внимание на EnvDTEExtensions.cs в T4Scaffolding (исходники его можно скачать отсюда: https://mvcscaffolding.codeplex.com/SourceControl/changeset/view/7cd57d172314), какие еще вспомогательные классы вам доступны. Фух! Ну что, попробуем разложить всё по полочкам, раскрошить программно любой код, а потом объяснить компьютеру, как мы пишем программы, и идти гонять чаи. Создадим новый проект: LessonProject.Scaffolding, и возьмем ту пару классов из первых уроков, с мечом и воином. IWeapon.cs: public interface IWeapon { void Kill(); } Bazuka.cs: public class Bazuka: IWeapon {
public void Kill() { Console.WriteLine(" BIG BADABUM! "); } }
Sword.cs: public class Sword: IWeapon { public void Kill() { Console.WriteLine(" Chuk-chuck"); } } Warrior.cs: /// < summary> /// This is LEGENDARY WARRIOR! /// < /summary> public class Warrior { readonly IWeapon Weapon;
public Warrior(IWeapon weapon) { this.Weapon = weapon; }
public void Kill() { Weapon.Kill(); } } Установим T4Scaffolding: Install-Package T4Scaffolding Создадим простейший PowerShell (/CodeTemplates/Scaffolders/Details/Details.ps1): [T4Scaffolding.Scaffolder(Description = " Print Details for class")][CmdletBinding()] param( [parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)][string]$ModelType, [string]$Project, [string]$CodeLanguage, [string[]]$TemplateFolders, [switch]$Force = $false ) $foundModelType = Get-ProjectType $ModelType -Project $Project -BlockUi if (! $foundModelType) { return }
$outputPath = Join-Path " Details" $ModelType
Add-ProjectItemViaTemplate $outputPath -Template Details ` -Model @{ ModelType = $foundModelType } ` -SuccessMessage " Yippee-ki-yay" ` -TemplateFolders $TemplateFolders -Project $Project -CodeLanguage $CodeLanguage -Force: $Force
Заданный тип данных передаем в Details.t4 (/CodeTemplates/Scaffolders/Details/Details.cs.t4): < #@ template language=" C#" HostSpecific=" True" Inherits=" DynamicTransform" debug=" true" #> < #@ assembly name=" System.Data.Entity" #> < #@ import namespace=" System.Linq" #> < #@ import namespace=" EnvDTE" #> < #@ Output Extension=" txt" #> < # var modelType = (EnvDTE.CodeType)Model.ModelType; #>
FullName: < #= modelType.FullName #> Name: < #= modelType.Kind #> < #= modelType.Name #> Access: < #= modelType.Access #> Attributes: < # foreach(var codeElement in modelType.Attributes) { var attr = (EnvDTE.CodeAttribute)codeElement; #> < #= attr.Name #> < # } #>
Bases: < # foreach(var codeElement in modelType.Bases) { var @base = (EnvDTE.CodeType)codeElement; #> < #= @base.Name #> < # } #>
Comment: < #= modelType.Comment #> DocComment: < #= modelType.DocComment #>
StartPoint: Line: < #= ((EnvDTE.TextPoint)modelType.StartPoint).Line #> EndPoint: Line: < #= ((EnvDTE.TextPoint)modelType.EndPoint).Line #>
Members: < # foreach(var codeElement in modelType.Members) { var member = (EnvDTE.CodeElement)codeElement; #> < #= member.Kind #> < #= member.Name #> < # } #>
Выведем для Warrior.cs PM> Scaffold Details Warrior -Force: $true Yippee-ki-yay · Имя\ полное имя · Тип модели · Доступ · Атрибуты модели · Базовый класс · Комментарий · Комментарий для документации · Строка файла, с которой началось объявление, и строка, на которой закончилось объявление · Имена членов класса с типом класса Мы можем исследовать классы, использовать направляющие атрибуты и на основе этого создавать промежуточные классы, т.е. автоматизировать процессы, которые слишком рутинны для ручной работы. В то же время у нас появляется преимущество, ведь автоматически сгенерированный код содержит меньше ошибок, так как часть человеческого фактора мы убираем.
|