Windows FormでC#のクラス調査ツールを作ってみた

## はじめに
この記事は[株式会社ラグザイア Advent Calendar 2023](https://qiita.com/advent-calendar/2023/luxiar)の提供でお送りします。

クラス図の作成をする際に、各クラスのプロパティとフィールドを調査する必要がありました。
この調査において、クラスの以下の情報が必要でした。
- アクセス修飾子（今回はpublicのみ抽出）
- 型名
- プロパティまたはフィールド名
- コメント


また、これらの情報をMarkdown形式で以下のように出力する必要がありました。
```
mermaid
erDiagram
  "クラス名"{
    型 名前 "コメント"
    int MyProperty1 "コメント"
    Hoge MyProperty2 "コメント"
   }
```

これくらいならそのへんのツールでちょちょいのちょいだろうと調べてみると、意外にも要件を満たしたものが見つかりません。（探し方が悪いかも？）
そこで同僚に聞いたところによると、VisualStudioのクラスデザイナー機能を使えば調べられるのではないかとのことなので試してみることにしました。

## クラスデザイナーの導入 for VS2022
クラスデザイナーはVisual Studio上で以下の手順に従って導入します。(VS2022を使用)
引用元：[クラス デザイナーの使用 - Visual Studio (Windows) | Microsoft Learn](https://learn.microsoft.com/ja-jp/visualstudio/ide/class-designer/designing-and-viewing-classes-and-types?view=vs-2022)

1.  Visual Studio のメニューバーから [ツール]>[ツールと機能を取得] を選択します。
1.  [個々のコンポーネント]タブを選択し、 [コードツール] カテゴリまで下にスクロールします。
1.  [クラスデザイナー]、[変更]の順に選択します。
1.  クラスデザイナーコンポーネントのインストールが開始します。

また、クラスデザイナーを導入することでクラスダイアグラムを作成することができます。
手順は以下の2パターンがあります。

- ソリューションエクスプローラーで、クラスファイルのコンテキストメニューを開き (右クリック)、[クラスダイアグラムの表示]を選択します。
または
- [クラスビュー]で、名前空間または型のコンテキストメニューを開き、[クラスダイアグラムで表示]を選択します。

## クラスデザイナーでクラス情報を取得してみた
以下のようなクラスを用意し、必要な情報が取得できるか確認しました。

<details><summary>SampleClass</summary>

```
namespace TypeScopeForm;

public class SampleClass
{
    public string StrProperty { get; set; } = string.Empty;

    public int IntProperty { get; set; } = 0;

    public int? NullableIntProperty { get; set; } = null;

    // コメント1
    public int MyProperty1 { get; set; }

    /// <summary>
    /// コメント2
    /// </summary>
    public int MyProperty2 { get; set; }

    public int MyProperty3 { get; set; } // コメント3

    // コメント4
    // コメント5
    public int MyProperty4 { get; set;}

    // コメント6
    private int MyProperty5 { get; set; }

    /// <summary>
    /// コメント7
    /// </summary>
    private int MyProperty6 { get; set; }

    private int MyProperty7 { get; set; } // コメント8

    // コメント9
    // コメント10
    private int MyProperty8 { get; set; }


    // コメント11
    public int Field1;

    /// <summary>
    /// コメント12
    /// </summary>
    public int Field2;

    public int Field3; // コメント13

    // コメント14
    // コメント15
    public int Field4;

    // コメント16
    private int Field5;

    /// <summary>
    /// コメント17
    /// </summary>
    private int Field6;

    private int Field7; // コメント18

    // コメント19
    // コメント20
    private int Field8;
}

```

</details>

結果は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586482/bbfe84d0-f33c-1b14-ea7a-f84b64b41eb6.png)


- アクセス修飾子（今回はpublicのみ）
- 型名
- プロパティまたはフィールド名
- コメント

ひとまず取れているようですが、コメントの取得に少し問題があるようです。
どうやら`<summary>`タグで囲まれたコメントしか取得できないようですね。

更に致命的な欠点として、これらの情報をテキストまたはMarkdown形式に書き出すために、クラスの詳細のセルから手動でコピペする必要があることが分かりました。
これはイケてませんね。

## Windows Formsで調査ツールを作ってみた
Windows Formsアプリでツールを作ってみました。
Roslynと呼ばれるC#及びVisual Basic .NETのコンパイラ・コード解析APIを使用しました。
Roslynについては同カレンダーにて後半に記事が載る予定なので手を抜くことにしました。

## 完成したものがこちら
オリジナルのものから機能を削ったライト版を急遽作ったのでバグがあるかもしれません。
ご了承ください。 
https://github.com/surfbear7d/TypeScopeFormLight

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586482/01436a7f-6d91-a646-7c80-cb4174945811.png)
※画像はprivateなプロパティ及びフィールドが表示されてますが、出力はpublicのみで行いました。

Markdown形式で出力したものがこちら
```
mermaid
erDiagram
  "TestClass" {
    string StrProperty ""
    int IntProperty ""
    int? NullableIntProperty ""
    int MyProperty1 "コメント1"
    int MyProperty2 "コメント2"
    int MyProperty3 "コメント3"
    int MyProperty4 "コメント4,  コメント5"
    int Field1 "コメント11"
    int Field2 "コメント12"
    int Field3 "コメント13"
    int Field4 "コメント14,  コメント15"
  }
```
いい感じに出力が出来ました。

## おわりに
このツールを作成したことで、クラス調査のプロセスが劇的に簡素化されました。
Roslynを初めて使いましたが、うまくクラスを解析できるものだと感心しました。
これを使えばコードが適切な規則に則って書かれているかどうかもチェックできるようです。
コードレビュー、プルリク、ダメだしお待ちしております。

読んでいただき、ありがとうございました。