Visual Studio 中自定义宏生成属性

     之前看到园子里的朋友,写了一个自动生成属性的小工具,可惜操作起来不太方便,要切换窗体。而Visual Studio中自带的自动生成属性的功能不好用,每次只能成生成一个,不能批量。今天在整理以前文档的时候,无意中发现N久之前还是使用VS2003的时候写的一个宏脚本,用来自动生成属性。
Imports EnvDTE

Imports System.Diagnostics



Public Module CreatePropertyCS



    
Sub CreatePropertyCS()

        
Dim selectedText As TextSelection = DTE.ActiveDocument.Selection

        
Dim boolWasOpen As Boolean

        
Dim propertyText As String

        
Dim Line As String

        
Dim Lines() As String





        
' if there was nothing selected, grab the entire line

        
If selectedText.IsEmpty Then

            selectedText.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstColumn, 
False)

            selectedText.EndOfLine(
True)

        
End If



        propertyText 
&= vbNewLine

        propertyText 
&= "#region Class Property"

        Lines 
= selectedText.Text.Split(vbNewLine)

        
For Each Line In Lines

            propertyText 
&= GetPropertyCodeCS(Line)

        
Next

        propertyText 
&= "#endregion"

        propertyText 
&= vbNewLine



        selectedText.EndOfLine()

        selectedText.NewLine()

        selectedText.Insert(propertyText, vsInsertFlags.vsInsertFlagsContainNewText)

        selectedText.SmartFormat()

        selectedText.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstText, 
False)



    
End Sub



    
Private Function GetPropertyCodeCS(ByVal codeLine As StringAs String

        
Dim propertyText As New System.Text.StringBuilder

        
Dim dataType As String

        
Dim originalVarName As String

        
Dim expIndex As Integer





        
' look for anything with a equals in it and truncate beyond that 



        
Dim chopIndex As Integer = codeLine.IndexOf("=")

        
If (chopIndex > -1Then

            codeLine 
= codeLine.Substring(0, chopIndex)

        
End If





        
' look for the // style of comments

        chopIndex 
= codeLine.IndexOf("//")

        
If (chopIndex > -1Then

            codeLine 
= codeLine.Substring(0, chopIndex)

        
End If





        
' look for the /* style of comments starting

        chopIndex 
= codeLine.IndexOf("/*")

        
If (chopIndex > -1Then

            codeLine 
= codeLine.Substring(0, chopIndex)

        
End If





        
' remove anything that might be left for spaces, etc.

        codeLine 
= codeLine.Trim()

        
Dim pieces() As String = codeLine.Split()

        
If (pieces.Length < 2Then

            
Exit Function

        
End If





        
' look for the originalVarName of the variable first (backwards)

        
For expIndex = pieces.Length - 1 To 0 Step -1

            originalVarName 
= pieces(expIndex).Trim()

            
If (originalVarName <> ""Then

                
Exit For

            
End If

        
Next





        
' remove the trailing semi-colon

        
If originalVarName.EndsWith(";"Then

            originalVarName 
= originalVarName.Substring(0, originalVarName.Length - 1)

        
End If





        
' now look for the datatype (backwards)

        
For expIndex = expIndex - 1 To 0 Step -1

            dataType 
= pieces(expIndex).Trim()

            
If (dataType <> ""Then

                
Exit For

            
End If

        
Next





        
Dim newPropertyName As String = originalVarName

        
If newPropertyName.StartsWith("_"Then

            
' remove it

            newPropertyName 
= newPropertyName.Substring(1)

        
End If

        
' uppercase the first character of the property name

        newPropertyName 
= newPropertyName.Substring(01).ToUpper() + newPropertyName.Substring(1)





        
' this builds the text to be converted 

        
' to make it simple to change, it's done in two steps

        propertyText.Append(vbNewLine)

        propertyText.Append(
"public %%type%% %%varname%%" + vbNewLine)

        propertyText.Append(
"{" + vbNewLine)

        propertyText.Append(
"get { " + vbNewLine + "return %%originalVarName%%;" + vbNewLine + "" + vbNewLine)

        propertyText.Append(
"set { " + vbNewLine + "%%originalVarName%% = value; " + vbNewLine + "" + vbNewLine)

        propertyText.Append(
"}" + vbNewLine)



        propertyText.Replace(
"%%type%%", dataType)

        propertyText.Replace(
"%%originalVarName%%", originalVarName)

        propertyText.Replace(
"%%varname%%", newPropertyName)



        
Return propertyText.ToString()

    
End Function



End Module

创建好宏之后,编译-〉将宏“CreatePropertyCS”按钮拖拉到工具栏中-〉然后用光标全选中字段(如:private int id;)可以选取多行-〉最后点击工具栏中“CreatePropertyCS”按钮,OK搞定!^_^ 快去试试吧!
posted @ 2009-08-29 12:30  Skybobo123  阅读(655)  评论(0编辑  收藏  举报