之前看到园子里的朋友,写了一个自动生成属性的小工具,可惜操作起来不太方便,要切换窗体。而Visual Studio中自带的自动生成属性的功能不好用,每次只能成生成一个,不能批量。今天在整理以前文档的时候,无意中发现N久之前还是使用VS2003的时候写的一个宏脚本,用来自动生成属性。
创建好宏之后,编译-〉将宏“CreatePropertyCS”按钮拖拉到工具栏中-〉然后用光标全选中字段(如:private int id;)可以选取多行-〉最后点击工具栏中“CreatePropertyCS”按钮,OK搞定!^_^ 快去试试吧!
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
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搞定!^_^ 快去试试吧!