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   String As   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  >   - 1 Then

            codeLine 
=  codeLine.Substring( 0 , chopIndex)

        
End   If





        
'  look for the // style of comments

        chopIndex 
=  codeLine.IndexOf( " // " )

        
If  (chopIndex  >   - 1 Then

            codeLine 
=  codeLine.Substring( 0 , chopIndex)

        
End   If





        
'  look for the /* style of comments starting

        chopIndex 
=  codeLine.IndexOf( " /* " )

        
If  (chopIndex  >   - 1 Then

            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  <   2 Then

            
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( 0 1 ).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搞定!^_^ 快去试试吧!

转载于:https://www.cnblogs.com/Skybobo123/archive/2009/08/29/1556246.html

你可能感兴趣的:(Visual Studio 中自定义宏生成属性)