• Stars
    star
    893
  • Rank 49,060 (Top 1.0 %)
  • Language
    C#
  • License
    MIT License
  • Created about 1 year ago
  • Updated about 1 month ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Adding `.Dump()` extension methods to Console Applications, similar to LinqPad's.

Dumpify

Github version

Improve productivity and debuggability by adding .Dump() extension methods to Console Applications. Dump any object in a structured and colorful way into the Console, Trace, Debug events or your own custom output.

How to Install

The library is published as a Nuget

Either run dotnet add package Dumpify, Install-Package Dumpify or use Visual Studio's NuGet Package Manager

Features

  • Dump any object in a structured, colorful way to Console, Debug, Trace or any other custom output
  • Support Properties, Fields and non-public members
  • Support max nesting levels
  • Support circular dependencies and references
  • Support styling and customizations
  • Highly Configurable
  • Support for differnt otuput targets: Console, Trace, Debug, Text, Custom
  • Fast!

Examples:

Anonymous types

new { Name = "Dumpify", Description = "Dump any object to Console" }.Dump();

image

Support nesting and circular references

var moaid = new Person { FirstName = "Moaid", LastName = "Hathot", Profession = Profession.Software };
var haneeni = new Person { FirstName = "Haneeni", LastName = "Shibli", Profession = Profession.Health };

moaid.Spouse = haneeni;
haneeni.Spouse = moaid;

moaid.Dump();
//You can define max depth as well, e.g `moaid.Dump(maxDepth: 2)`

image

Support for Arrrays, Dictionaries and Collections

var arr = new[] { 1, 2, 3, 4 }.Dump();

image

var arr2d = new int[,] { {1, 2}, {3, 4} }.Dump();

image

new Dictionary<string, string>
{
   ["Moaid"] = "Hathot",
   ["Haneeni"] = "Shibli",
   ["Eren"] = "Yeager",
   ["Mikasa"] = "Ackerman",
}.Dump();

image

You can turn on or off fields and private members

public class AdditionValue
{
    private readonly int _a;
    private readonly int _b;

    public AdditionValue(int a, int b)
    {
        _a = a;
        _b = b;
    }

    private int Value => _a + _b;
}


new AdditionValue(1, 2).Dump(members: new MembersConfig { IncludeFields = true, IncludeNonPublicMembers = true });

image

You can customize colors

var package = new { Name = "Dumpify", Description = "Dump any object to Console" };
package.Dump(colors: ColorConfig.NoColors);
package.Dump(colors: new ColorConfig { PropertyValueColor = new DumpColor(Color.RoyalBlue)});

image

You can turn on or off type names, headers, lables and much more

var moaid = new Person { FirstName = "Moaid", LastName = "Hathot", Profession = Profession.Software };
var haneeni = new Person { FirstName = "Haneeni", LastName = "Shibli", Profession = Profession.Health };
moaid.Spouse = haneeni;
haneeni.Spouse = moaid;

moaid.Dump(typeNames: new TypeNamingConfig { ShowTypeNames = false }, tableConfig: new TableConfig { ShowTableHeaders = false });

image

There are multiple output options (Console, Trace, Debug, Text) or provide your own

var package = new { Name = "Dumpify", Description = "Dump any object to Console" };
package.Dump(); //Similar to `package.DumpConsole()` and `package.Dump(output: Outputs.Console))`
package.DumpDebug(); //Dump to Visual Studio's Debug source
package.DumpTrace(); //Dump to Trace 
var text = package.DumpText(); //The table in a text format

using var writer = new StringWriter();
package.Dump(output: new DumpOutput(writer)); //Custom output

Every configuration can be defiend per-Dump or globally for all Dumps, e.g:

DumpConfig.Default.TypeNamingConfig.UseAliases = true;
DumpConfig.Default.TypeNamingConfig.ShowTypeNames = false;
DumpConfig.Default.ColorConfig.TypeNameColor = Color.Gold;
DumpConfig.Default.MaxDepth = 3;
//Much more...

Features for the future 0.6.0 release

  • Add configuration for formatting Anonymous Objects type names
  • Cache Spectre.Console styles and colors
  • Text renderer
  • Consider disabling wrapping of Table titles
  • re-introduce labels
  • Better styling of Custom values
    • Typeof(T) for example, Generic types, etc.
  • Better rendering of Delegates

To do

  • Live outputs
  • Add custom rendering for more types:
    • DataTable & DataSets
    • Exceptions, AggregateExceptions, etc...
  • Rethink Generators caching keys
  • Consider using Max Depth for Descriptors
  • Refactor Renderers and make it better extendable
  • Add more renderers
    • Text Renderers
    • re-introduce Json
    • CSharp Renderer
  • Consider Decoupling from Spectre.Console
  • Tests
    • More tests
    • Visual (Render) Tests - consider acceptance tests
    • Tests for Nesting
  • More sync between Custom Descriptors and Custom Renderers
    • Think how we can mark type's descriptor as needing special rendering.
    • The current CustomDescriptorGenerator must generate a value
    • Consider ValueTuple
  • Refactor SpectureTableRenderer to share customization code
  • Consider changing the style/view of ObjectDescriptors without properties (currently empty table)