在编写c#代码过程中,我们经常需要做一些重复枯燥的工作。例如,编写DTO(数据访问对象),通常就是为一个类定义一系列的变量和属性。
有一些第三方的IDE辅助工具,可以为我们生成一些代码,减少工作量。例如,Assist X就是一款很值得推荐的工具,使用其提供的Encapsulate Field功能,可以很方便地将一个类地编写封装为属性。
我今天需要介绍的如何使用Visual Studio 2005 IDE中自带的宏实现类似的功能。
打开Visual Studio 2005 IDE,选择“工具” > "宏" > “宏 IDE”,选择“添加模块”。例如,我是在MyMacros项目中新增了一个EditorHelper模块,代码如下:
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics
Public Module EditorHelper
' 为一个参数封装一般属性访问器
Public Sub EncapsulateField()
Dim projectItem As ProjectItem = DTE.ActiveDocument.ProjectItem
Dim fileCodeModel As FileCodeModel = projectItem.FileCodeModel
' 得到当前选定的内容
Dim selectText As TextSelection = DTE.ActiveDocument.Selection
' 获取到当前光标的位置
Dim point As TextPoint = selectText.ActivePoint
Try
Dim codeElement As CodeElement = fileCodeModel.CodeElementFromPoint(point, vsCMElement.vsCMElementVariable)
If (codeElement Is Nothing ) Then
Return
End If
Debug.Assert(codeElement.Kind = vsCMElement.vsCMElementVariable)
Dim codeVar As CodeVariable = CType(codeElement, CodeVariable)
Dim fieldName As String = codeVar.Name
Dim codeClass As CodeClass = CType(codeVar.Parent, CodeClass)
AddPropertyToClass(codeClass, fieldName, codeVar.Type)
Catch ex As Exception
' 吃掉异常,不做处理或者提示
End Try
End Sub
Public Sub EncapsulateAllFields()
Dim projectItem As ProjectItem = DTE.ActiveDocument.ProjectItem
Dim fileCodeModel As FileCodeModel = projectItem.FileCodeModel
Try
' 得到当前选定的内容
Dim selectText As TextSelection = DTE.ActiveDocument.Selection
' 获取到当前光标的位置
Dim point As TextPoint = selectText.ActivePoint
Dim codeElement As CodeElement = fileCodeModel.CodeElementFromPoint(point, vsCMElement.vsCMElementClass)
Dim codeClass As CodeClass = CType(codeElement, CodeClass)
Dim i As Integer
For i = 1 To codeClass.Members.Count
' 如果属性已经定义,会抛出异常
' 在这里处理异常,即使新增的属性已经定义,也可以继续处理下面的代码
Try
Dim element As CodeElement = codeClass.Members.Item(i)
If (element.Kind =
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics
Public Module EditorHelper
' 为一个参数封装一般属性访问器
Public Sub EncapsulateField()
Dim projectItem As ProjectItem = DTE.ActiveDocument.ProjectItem
Dim fileCodeModel As FileCodeModel = projectItem.FileCodeModel
' 得到当前选定的内容
Dim selectText As TextSelection = DTE.ActiveDocument.Selection
' 获取到当前光标的位置
Dim point As TextPoint = selectText.ActivePoint
Try
Dim codeElement As CodeElement = fileCodeModel.CodeElementFromPoint(point, vsCMElement.vsCMElementVariable)
If (codeElement Is Nothing ) Then
Return
End If
Debug.Assert(codeElement.Kind = vsCMElement.vsCMElementVariable)
Dim codeVar As CodeVariable = CType(codeElement, CodeVariable)
Dim fieldName As String = codeVar.Name
Dim codeClass As CodeClass = CType(codeVar.Parent, CodeClass)
AddPropertyToClass(codeClass, fieldName, codeVar.Type)
Catch ex As Exception
' 吃掉异常,不做处理或者提示
End Try
End Sub
Public Sub EncapsulateAllFields()
Dim projectItem As ProjectItem = DTE.ActiveDocument.ProjectItem
Dim fileCodeModel As FileCodeModel = projectItem.FileCodeModel
Try
' 得到当前选定的内容
Dim selectText As TextSelection = DTE.ActiveDocument.Selection
' 获取到当前光标的位置
Dim point As TextPoint = selectText.ActivePoint
Dim codeElement As CodeElement = fileCodeModel.CodeElementFromPoint(point, vsCMElement.vsCMElementClass)
Dim codeClass As CodeClass = CType(codeElement, CodeClass)
Dim i As Integer
For i = 1 To codeClass.Members.Count
' 如果属性已经定义,会抛出异常
' 在这里处理异常,即使新增的属性已经定义,也可以继续处理下面的代码
Try
Dim element As CodeElement = codeClass.Members.Item(i)
If (element.Kind =