Visual Studio利用宏生成Get和Set属性的代码

本文介绍如何通过Visual Studio的宏实现自动封装字段,生成Get和Set访问器。提供了两种方法:封装单个字段和封装所有字段。在宏中,首先获取选中的代码元素,然后判断其是否为变量,接着为每个变量生成对应的属性,并设置访问权限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 = vsCMElement.vsCMElementVariable) Then
                        Dim codeVariable As CodeVariable = CType(element, CodeVariable)
                        If (Not codeVariable.IsShared) Then     '静态变量不需要增加属性
                            AddPropertyToClass(codeClass, codeVariable.Name, codeVariable.Type)
                        End If
                    End If
                Catch ex As Exception
                    '吃掉异常
                End Try
            Next
        Catch ex As Exception
            '可能并没有选择有效的类定义,这时会抛出异常,忽略
        End Try
    End Sub

    '根据成员的名称的类型,在类对象中插入属性
    Private Sub AddPropertyToClass(ByVal codeClass As CodeClass, ByVal fieldName As String, ByVal fieldType As Object)
        '生成属性的名称,规则是首先字母大写。如果变量的开头为“_”,移除
        Dim propertyName As String = fieldName
        If (propertyName.StartsWith("_")) Then
            propertyName = propertyName.TrimStart("_"c)
        End If
        propertyName = propertyName.Substring(0, 1).ToUpper() & propertyName.Substring(1)

        '创建属性对象
        '-1表示代码插入到类的最下方
        'vsCMAccess.vsCMAccessPublic表示为public
        Dim codeProperty As CodeProperty = codeClass.AddProperty(propertyName, propertyName, fieldType, -1, vsCMAccess.vsCMAccessPublic)
        'Getter
        Dim getter As CodeFunction = codeProperty.Getter
        Dim getterPoint As TextPoint = getter.GetStartPoint(vsCMPart.vsCMPartBody)
        Dim getterEditPoint As EditPoint = getterPoint.CreateEditPoint()
        getterEditPoint.Delete(getter.GetEndPoint(vsCMPart.vsCMPartBody))
        getterEditPoint.Insert(vbCrLf)      '插入回车符
        getterEditPoint.LineUp()
        getterEditPoint.Indent(, 4)         '缩进4个位置
        getterEditPoint.Insert("return " & fieldName & ";")
        'Setter
        Dim setter As CodeFunction = codeProperty.Setter
        Dim setterPoint As TextPoint = setter.GetStartPoint(vsCMPart.vsCMPartBody)
        Dim setterEditPoint As EditPoint = setterPoint.CreateEditPoint()
        setterEditPoint.Insert(vbCrLf)     '插入回车符
        setterEditPoint.LineUp()
        setterEditPoint.Indent(, 4)         '缩进4个位置
        setterEditPoint.Insert(fieldName & " = value;")
    End Sub
End Module

-------------用法-------------------

打开Visual Studio 中选择:工具->宏->宏资源管理->在宏资源管理当中单击右键->新建宏项目->名称必须为"AddFields"->括号当中的这一步或者有必要自己手运创建或者没必要手动创建(新建模块名称必须为它:"EditorHelper")->打开EditorHelper将txt当中的文本复制到它里面即可    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值