Создание макросов в Visual Studio .NET

Источник: realcoding

Загрузить примеры - 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 ) который имеет несколько крутых фишек по использованию возможностей макросов. Правдо я быстро сталкнулся с ограничениями продукта, когда попробывал обработать более чем одну линию за раз, но тем немение он послужил причиной написания моего первого макроса.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=30026