Source Generator で enumの情報(基底型とか定数値)を取得する

  • C#
  • Source Generator

タイトルの通りです。
Source Generatorに関する情報はまだ少ないので、簡単にですがまとめておきます。
誰かのお役に立てれば幸いです。

Executeメソッドの実装以外は省略しています。

public void Execute(GeneratorExecutionContext context)
{
    // Enum型の完全修飾名からシンボルを取得
    INamedTypeSymbol type = context.Compilation.GetTypeByMetadataName("System.DayOfWeek");

    // 基底型のシンボル(DayOfWeekならint)
    INamedTypeSymbol underlyingType = type.EnumUnderlyingType;

    // シンボルがEnum型のものかどうか判定
    bool isEnum = type.TypeKind == TypeKind.Enum;
    // 基底型の有無でも判定可能
    // bool isEnum = type.EnumUnderlyingType is not null;

    // フィールドのシンボルだけ取得
    foreach (var member in type.GetMembers().OfType<IFieldSymbol>())
    {
        // メンバー名
        string name = member.Name;

        // 定数値
        object value = member.ConstantValue;
    }
}