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.0var generator = new SchemeGenerator();
var json = generator.GetDefaultJson(typeof(ComplexType));
// or with generics
var model = generator.GetDefault<ComplexType>();
var json2 = 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) |
var target = new SimpleType();
generator.Populate(target);Mark a partial type and reference the analyzer package:
[GenerateSchemeDefaults]
public partial class OrderDto
{
public int Id { get; set; }
public string Sku { get; set; } = string.Empty;
}
var order = OrderDto.OrderDtoSchemeDefaults.Create();
var json = 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>]
public void MyTest(ComplexType model) => Assert.NotNull(model);
[Theory, SchemeGeneratorData(typeof(SimpleType))]
public void OtherTest(SimpleType model) => 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).
public class SimpleType
{
public int Number { get; set; }
public string Text { get; set; }
}
public class ComplexType
{
public List<int> Numbers { get; set; }
public List<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.