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);