TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

C#のオブジェクトをダンプする

C#のオブジェクトに格納されている値を調べたいときに、VS Codeなどのデバッガを使えば確認することができるが、オブジェクトの階層が深い場合は、テキストファイルにダンプして確認したくなる。

ObjectDumper.NET

方法がないか調べたところ、「ObjectDumper.NET」というツールが見つかった。
.NET Coreに対応しており、「dotnet add package ObjectDumper.NET」でインストールできる。

dotnet search ObjectDumper」でNuGetのパッケージを検索すると、他にも見つかるが、階層の制限や、除外するプロパティの設定ができるのは、ObjectDumper.NETだけだった。

privateフィールドのダンプ

ObjectDumper.NETは、publicなフィールドしかダンプできないため、privateフィールドもダンプしたい場合は、ソースの修正が必要になる。

GitHubからソースをクローンして、「ObjectDumper/Internal/ObjectDumperConsole.cs」を以下の通り編集する。

var publicFields = element.GetType().GetRuntimeFields().Where(f => !f.IsPrivate);

var publicFields = element.GetType().GetRuntimeFields()/*.Where(f => !f.IsPrivate)*/;

また、除外設定が、フィールドに対しては効かないので、直後に以下の行を追加する。

if (this.DumpOptions.ExcludeProperties != null && this.DumpOptions.ExcludeProperties.Any())
{
    publicFields = publicFields
        .Where(p => !this.DumpOptions.ExcludeProperties.Contains(p.Name))
        .ToList();
}

ソースを修正したら、以下のようにして.csprojにプロジェクトを参照するか

  <ItemGroup>
    <ProjectReference Include="../ObjectDumper/ObjectDumper/ObjectDumper.csproj" />
  </ItemGroup>

dotnet build -c Release」でビルドして、DLLをプロジェクトのディレクトリにコピーして.csprojにDLLの参照を追加する。

  <ItemGroup>
    <Reference Include="ObjectDumper"><HintPath>ObjectDumping.dll</HintPath></Reference>
  </ItemGroup>

使用例

var options = new DumpOptions();
options.MaxLevel = 5; // 5階層に制限
options.ExcludeProperties.add("ignoreField"); // 除外フィールド
var dump = ObjectDumper.Dump(obj, options);