Visual Studio 中自定义宏生成属性
之前看到园子里的朋友,写了一个自动生成属性的小工具,可惜操作起来不太方便,要切换窗体。而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搞定!^_^ 快去试试吧!