VS2005でフィールド群からプロパティ群を生成するマクロ

いまさらながらフィールドからのプロパティ生成がひとつずつしかできないのに我慢できなくなったのでマクロを作成。VS2005のマクロはよく分からないのでおかしなところが多々あるかも。
各フィールドの下にプロパティを作るというスタンスもあるが、「プロパティ全削除→全再生成」という使い方をしたいのでクラスの一番下に追加する形にしてある。
C#専用のコードだが、Appendのところだけ変えればVB.NET等でも利用可。

Option Explicit On

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Collections.Generic
Imports System.Diagnostics
Imports System.Text

Public Module MyUtils
    ' C#専用プロパティ生成マクロ
    ' クラスの一番後ろにまとめてプロパティを追加する。
    ' 既に同名プロパティが存在する場合は追加しない。
    ' フィールド名が「aaa」の場合はプロパティ名は「Aaa」となる。
    ' いろいろと適当に作ってある。
    Sub CreateProperty()
        Dim selection As TextSelection = DTE.ActiveDocument.Selection
        Dim activePoint As TextPoint = selection.ActivePoint
        Dim element As CodeElement = activePoint.CodeElement(vsCMElement.vsCMElementClass)
        Dim codeType As CodeType = CType(element, CodeType)

        Dim listProperty As New List(Of String)
        Dim listField As New List(Of CodeVariable)
        Dim lastMember As CodeElement
        For Each member As CodeElement In codeType.Members
            If TypeOf member Is CodeProperty Then
                listProperty.Add(member.Name)
            ElseIf TypeOf member Is CodeVariable Then
                listField.Add(member)
            End If
            lastMember = member
        Next

        Dim editPoint As EditPoint
        Dim sb As New StringBuilder
        For Each variable As CodeVariable In listField
            Dim pName As String = VtoPName(variable.Name)
            If listProperty.Contains(pName) Then
                Continue For
            End If
            sb.AppendLine().AppendLine()
            sb.Append("/// <summary>").AppendLine()
            sb.Append("/// ").AppendLine()
            sb.Append("/// </summary>").AppendLine()
            sb.Append("public " & variable.Type.AsString & " " & pName).AppendLine()
            sb.Append("{").AppendLine()
            sb.Append("    get { return this." & variable.Name & "; }").AppendLine()
            sb.Append("    set { this." & variable.Name & " = value; }").AppendLine()
            sb.Append("}")
        Next
        editPoint = lastMember.GetEndPoint.CreateEditPoint()
        editPoint.Insert(sb.ToString())
        DTE.ExecuteCommand("Edit.FormatDocument")
    End Sub

    Private Function VtoPName(ByVal vName As String) As String
        Return vName.Substring(0, 1).ToUpper() & vName.Substring(1)
    End Function
End Module

参考:[.net]VSマクロ(プロパティー一括生成)をVS2003対応 - murasukeの日記