Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Снова шаблоны, 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

· Имя\ полное имя

· Тип модели

· Доступ

· Атрибуты модели

· Базовый класс

· Комментарий

· Комментарий для документации

· Строка файла, с которой началось объявление, и строка, на которой закончилось объявление

· Имена членов класса с типом класса

Мы можем исследовать классы, использовать направляющие атрибуты и на основе этого создавать промежуточные классы, т.е. автоматизировать процессы, которые слишком рутинны для ручной работы. В то же время у нас появляется преимущество, ведь автоматически сгенерированный код содержит меньше ошибок, так как часть человеческого фактора мы убираем.


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.012 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал