Автор: James Coleman. Перевод: LoI для
Realcoding.NET

Загрузить
примеры - 1.13 кб
Привет крутой кодер. Ты наверное не раз слышал о таких замечательных вещах
как макросы, которые позволяет сэкономить кучу времени в процессе разработки и
сделать твой код более удобочитаемым. Я тоже слышал о них довольно много
интересного, но все не хватало времени в них разобраться. Наверное, у тебя та-же
проблема? Но сегодня мир вокруг тебя изменится, пристигни ремни, сейчас мы с
тобой научимся создавать макросы в Visual Studio.net,
что позволит тебе в будущем хоть немного облегчить нелегкий программерский труд.
Макрос который мы создадим, будет автоматически создавать переменные а также
их соответствующие Pubic-свойства. Чтобы показать как
макрос может по-разному работать в зависимости от заданных условий, мы создадим
окошко, в котором спросим у пользователя действительно ли члены должны быть
сортированы в алфавитном порядке.
КОДДИНГ
Требование к макросу:
Макрос должен из этого:
CustomerName String
AccountBalance Double
CustomerPhone String
CustomerAddress String
CustomerID Integer
Сделать это:
Private mAccountBalance as
Double
Private mCustomerAddress as
String
Private mCustomerID as
Integer
Private mCustomerName as
String
Private mCustomerPhone
As String
Public Property
AccountBalance As
Double
Get
Return
mAccountBalance
End
Get
Set(ByVal
Value As Double)
mAccountBalance = Value
End
Set
End Property
Public Property
CustomerAddress As
String
Get
Return
mCustomerAddress
End
Get
Set(ByVal
Value As String)
mCustomerAddress = Value
End
Set
End Property
Public Property
CustomerID As Integer
Get
Return
mCustomerID
End
Get
Set(ByVal
Value As Integer)
mCustomerID = Value
End
Set
End Property
Public Property
CustomerName As String
Get
Return
mCustomerName
End
Get
Set(ByVal
Value As String)
mCustomerName = Value
End
Set
End Property
Public Property
CustomerPhone As String
Get
Return
mCustomerPhone
End
Get
Set(ByVal
Value As String)
mCustomerPhone = Value
End
Set
End Property
От слов к делу:
Чтобы создать наш макрос сначала зайдем в Macro IDE
(Tools
-> Macros -> Macro IDE
или
Alt+F11). Выбираем
существующий макро проект, или создаем новый и добавляем в него макро модуль. Ты
можешь использовать дофига методов внутри каждого макроса, но сейчас нас
интерисует только один -
ConvertProperties(). Этот метод возвращает
текущий выделенный текст, обрабатывает его и заменяет его декларациями членов и
свойств.
Получаем доступ к тексту:
Чтобы получить доступ к выделенному пользователем тексту, будем использовать
множество имен EnvDTE
Dim txt As TextSelection
txt = DTE.ActiveDocument.Selection
Using
RegEx:
Регулярные выражения нам пригодятся для опознования выделенного текста, и
позволят нам выделить имена свойств и типы переменных. Отсевать данные мы будем
по словам varname и typename.
Dim r As Regex
r = New Regex( _
"s*(?S*)s*(?S*)", _
RegexOptions.IgnoreCase Or RegexOptions.ExplicitCapture)
Построчная обработка:
В процессе разделения выбранного текста на линии, мы заполняем массив линий,
с которым и будем дальше работать. Мы проверяем соответствие линии, нашему
регулярному выражению, и если они совпадают, мы создаем член с синтаксисом
свойства, используя varname и
typename в качестве параметров. После того синтаксис динамически создан,
мы можем поместить его в документ.
Внимание: приведенный
ниже код разделен для облегчения понимания
Dim line, originalCode As String
Dim lines() As String = Split(txt.Text, vbLf)
For Each line In lines
line = line.Trim
If Not line = "" Then
Dim mtch As Match
mtch = r.Match(line)
If mtch.Success Then
publicName = mtch.Groups("varname").Value.Trim
dataType = mtch.Groups("typename").Value.Trim
memberName = String.Concat("m", publicName)
propertyProcedure = _
String.Format("Public Property {1} As {2}{0}" _
& " Get{0}" _
& " Return {3}{0}" _
& " End Get{0}" _
& " Set(ByVal Value As {2}){0}" _
& " {3} = Value{0}" _
& " End Set{0}" _
& "End Property", vbCrLf, publicName, _
dataType, memberName)
txt.Insert(vbCrLf & propertyProcedure)
End If
End If
Next
Пользовательский ввод:
Бывает возникает необходимость позволить пользователю решать некоторые
аспекты в работе макроса. Чтобы продемонстрировать это в нашем макросе, мы
создадим окно, в котором спросим пользователя о необходимости сортировки членов
по алфавиту.
Dim sortAZ As MsgBoxResult
sortAZ = MsgBox("Sort Alphabetically", MsgBoxStyle.YesNo, "Sort Order")
If sortAZ = MsgBoxResult.Yes Then
System.Array.Sort(lines)
End If
Использование
нашего
макроса:
Итак мы создали
свой макрос, круто правда? :) Теперь нам надо его использовать. Это можно
сделать выделив текст который содержит имена свойств и типы переменных, и дважды
кликнув на названии макро-метода в менеджере макросов. Кроме того можно
назначить кнопку, например
Alt-M
заходим в
Tools
->
Options
->
Environment
->
Keyboard
и назначаем
Macros.MerlinMacros.Merlin.ConvertProperties
сочетанию клавиш
Alt-M
Немного вкусностей:
Есть такой
продукт QuickCode
.NET
(http://www.dvxp.com/en/QuickCode.aspx
) который имеет
несколько крутых фишек по использованию возможностей макросов. Правдо я быстро
сталкнулся с ограничениями продукта, когда попробывал обработать более чем одну
линию за раз, но тем немение он послужил причиной написания моего первого
макроса.