Scheme Generator builds default object graphs and JSON for any .NET type. Use it for unit tests, OpenAPI examples, and quick fixtures without hand-writing sample data.
| Package | Description |
|---|---|
| SchemeGenerator | Core reflection-based generator |
| SchemeGenerator.SourceGenerators | Roslyn source generator for compile-time defaults |
| SchemeGenerator.Xunit | xUnit [Theory] data attributes |
| SchemeGenerator.AspNetCore | Swashbuckle schema example filter |
All packages are version 10.1.0 and target net8.0, net9.0, and net10.0 (except the analyzer, which is a Roslyn component).
- Consumers: .NET 8, 9, or 10
- Building from source: .NET 10 SDK (
global.json)
Core package:
dotnet add package SchemeGenerator --version 10.1.0With source generator:
dotnet add package SchemeGenerator --version 10.1.0
dotnet add package SchemeGenerator.SourceGenerators --version 10.1.0vargenerator=newSchemeGenerator();varjson=generator.GetDefaultJson(typeof(ComplexType));// or with genericsvarmodel=generator.GetDefault<ComplexType>();varjson2=generator.GetDefaultJson<ComplexType>();builder.Services.AddSchemeGenerator(options =>{options.CollectionItemCount=2;options.PrimitiveMode=PrimitiveDefaultsMode.Sample;});// inject ISchemeGenerator| Property | Default | Description |
|---|---|---|
CollectionItemCount | 1 | Items in arrays and collections |
MaxDepth | 32 | Max recursion depth (cycle safety) |
PrimitiveMode | Zero | Zero = CLR defaults; Sample = realistic primitives |
JsonSerializerOptions | null | Passed to GetDefaultJson |
| Attribute | Target | Description |
|---|---|---|
[SchemeIgnore] | Property | Skip property |
[SchemeCount(n)] | Property | Override collection size |
[SchemeValue(x)] | Property | Fixed value |
[GenerateSchemeDefaults] | Type | Enable source generator (type must be partial) |
vartarget=newSimpleType();generator.Populate(target);Mark a partial type and reference the analyzer package:
[GenerateSchemeDefaults]publicpartialclassOrderDto{publicintId{get;set;}publicstringSku{get;set;}=string.Empty;}varorder=OrderDto.OrderDtoSchemeDefaults.Create();varjson=OrderDto.OrderDtoSchemeDefaults.CreateJson();Nested user types without [GenerateSchemeDefaults] fall back to the reflection-based SchemeGenerator at runtime.
dotnet add package SchemeGenerator.Xunit --version 10.1.0[Theory,AutoSchemeData<ComplexType>]publicvoidMyTest(ComplexTypemodel)=>Assert.NotNull(model);[Theory,SchemeGeneratorData(typeof(SimpleType))]publicvoidOtherTest(SimpleTypemodel)=>Assert.NotNull(model);dotnet add package SchemeGenerator.AspNetCore --version 10.1.0builder.Services.AddSchemeGenerator();builder.Services.AddSwaggerGen(options =>{options.AddSchemeGeneratorExamples();});Register SchemeGeneratorSchemaFilter via DI (Swashbuckle resolves it from the container when using AddSchemeGeneratorExamples).
publicclassSimpleType{publicintNumber{get;set;}publicstringText{get;set;}}publicclassComplexType{publicList<int>Numbers{get;set;}publicList<SimpleType>Objects{get;set;}}Default JSON (PrimitiveMode.Zero):
{
"Numbers": [0],
"Objects": [{ "Number": 0, "Text": "" }]
}See SchemeGenerator.Benchmarks:
dotnet run -c Release --project SchemeGenerator.BenchmarksCompares reflection vs source-generated creation for the same DTO.
dotnet restore
dotnet test -c Release
dotnet pack SchemeGenerator/SchemeGenerator.csproj -c Release
dotnet pack SchemeGenerator.SourceGenerators/SchemeGenerator.SourceGenerators.csproj -c Release
dotnet pack SchemeGenerator.Xunit/SchemeGenerator.Xunit.csproj -c Release
dotnet pack SchemeGenerator.AspNetCore/SchemeGenerator.AspNetCore.csproj -c ReleaseSee CONTRIBUTING.md. Release notes: CHANGELOG.md.
MIT — see LICENSE.