Привет крутой кодер. Ты наверное не раз слышал о таких замечательных вещах как макросы, которые позволяет сэкономить кучу времени в процессе разработки и сделать твой код более удобочитаемым. Я тоже слышал о них довольно много интересного, но все не хватало времени в них разобраться. Наверное, у тебя та-же проблема? Но сегодня мир вокруг тебя изменится, пристигни ремни, сейчас мы с тобой научимся создавать макросы вVisual Studio.net, что позволит тебе в будущем хоть немного облегчить нелегкий программерский труд.
Макрос который мы создадим, будет автоматически создавать переменные а также их соответствующиеPubic-свойства. Чтобы показать как макрос может по-разному работать в зависимости от заданных условий, мы создадим окошко, в котором спросим у пользователя действительно ли члены должны быть сортированы в алфавитном порядке.
PublicPropertyAccountBalanceAsDouble Get ReturnmAccountBalance EndGet Set(ByValValueAsDouble) mAccountBalance = Value EndSet EndProperty PublicPropertyCustomerAddressAsString Get ReturnmCustomerAddress EndGet Set(ByValValueAsString) mCustomerAddress = Value EndSet EndProperty PublicPropertyCustomerIDAsInteger Get ReturnmCustomerID EndGet Set(ByValValueAsInteger) mCustomerID = Value EndSet EndProperty PublicPropertyCustomerNameAsString Get ReturnmCustomerName EndGet Set(ByValValueAsString) mCustomerName = Value EndSet EndProperty PublicPropertyCustomerPhoneAsString Get ReturnmCustomerPhone EndGet Set(ByValValueAsString) mCustomerPhone = Value EndSet EndProperty
От слов к делу:
Чтобы создать наш макрос сначала зайдем вMacro IDE(Tools->Macros->Macro IDEилиAlt+F11). Выбираем существующий макро проект, или создаем новый и добавляем в него макро модуль. Ты можешь использовать дофига методов внутри каждого макроса, но сейчас нас интерисует только один -ConvertProperties(). Этот метод возвращает текущий выделенный текст, обрабатывает его и заменяет его декларациями членов и свойств.
Получаем доступ к тексту:
Чтобы получить доступ к выделенному пользователем тексту, будем использовать множество именEnvDTE
Dim txt As TextSelection txt = DTE.ActiveDocument.Selection
UsingRegEx:
Регулярные выражения нам пригодятся для опознования выделенного текста, и позволят нам выделить имена свойств и типы переменных. Отсевать данные мы будем по словамvarnameиtypename.
Dim r As Regex r = New Regex( _ "s*(?S*)s*(?S*)", _ RegexOptions.IgnoreCase Or RegexOptions.ExplicitCapture)
Построчная обработка:
В процессе разделения выбранного текста на линии, мы заполняем массив линий, с которым и будем дальше работать. Мы проверяем соответствие линии, нашему регулярному выражению, и если они совпадают, мы создаем член с синтаксисом свойства, используяvarnameиtypenameв качестве параметров. После того синтаксис динамически создан, мы можем поместить его в документ.
Внимание: приведенный ниже код разделен для облегчения понимания
Dim line, originalCode AsStringDim lines() AsString = Split(txt.Text, vbLf)
ForEach line In lines
line = line.Trim
IfNot line = ""ThenDim 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)
EndIfEndIfNext
Пользовательский ввод:
Бывает возникает необходимость позволить пользователю решать некоторые аспекты в работе макроса. Чтобы продемонстрировать это в нашем макросе, мы создадим окно, в котором спросим пользователя о необходимости сортировки членов по алфавиту.
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) который имеет несколько крутых фишек по использованию возможностей макросов. Правдо я быстро сталкнулся с ограничениями продукта, когда попробывал обработать более чем одну линию за раз, но тем немение он послужил причиной написания моего первого макроса.