diff --git a/README.md b/README.md index 859dd9441..c5aaacf27 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -# RSCG - 252 Examples of Roslyn Source Code Generators / 16 created by Microsoft / +# RSCG - 253 Examples of Roslyn Source Code Generators / 16 created by Microsoft / -The RSCG_Examples repository is a comprehensive documentation system that automatically processes and showcases 252 Roslyn Source Code Generator (RSCG) examples. The system transforms individual RSCG projects into structured documentation with code examples and cross-referenced content with a searchable website and code example exports. +The RSCG_Examples repository is a comprehensive documentation system that automatically processes and showcases 253 Roslyn Source Code Generator (RSCG) examples. The system transforms individual RSCG projects into structured documentation with code examples and cross-referenced content with a searchable website and code example exports. This system serves as both a learning resource for .NET developers interested in source generators and an automated pipeline for maintaining up-to-date documentation about the RSCG ecosystem -## Latest Update : 2026-01-28 => 28 January 2026 +## Latest Update : 2026-02-01 => 01 February 2026 If you want to see examples with code, please click ***[List V2](https://ignatandrei.github.io/RSCG_Examples/v2/docs/List-of-RSCG)*** @@ -24,8 +24,30 @@ If you want to be notified each time I add a new RSCG example , please click htt ## Content -Those are the 252 Roslyn Source Code Generators that I have tested you can see and download source code example. +Those are the 253 Roslyn Source Code Generators that I have tested you can see and download source code example. ( including 16 from Microsoft ) +### 253. [FastCloner](https://ignatandrei.github.io/RSCG_Examples/v2/docs/FastCloner) , in the [Clone](https://ignatandrei.github.io/RSCG_Examples/v2/docs/rscg-examples#clone) category + +Generated on : 2026-02-01 => 01 February 2026 + +
+ Expand + + + +Author: Matěj Štágl + +Fast deep cloning library for .NET 8+. Supports both deep and shallow cloning. Extensively tested, focused on performance and stability even on complicated object graphs. + +Nuget: [https://www.nuget.org/packages/FastCloner/](https://www.nuget.org/packages/FastCloner/) + + +Link: [https://ignatandrei.github.io/RSCG_Examples/v2/docs/FastCloner](https://ignatandrei.github.io/RSCG_Examples/v2/docs/FastCloner) + +Source: [https://github.com/lofcz/FastCloner/](https://github.com/lofcz/FastCloner/) + +
+ ### 252. [RSCG_idempotency](https://ignatandrei.github.io/RSCG_Examples/v2/docs/RSCG_idempotency) , in the [Idempotency](https://ignatandrei.github.io/RSCG_Examples/v2/docs/rscg-examples#idempotency) category Generated on : 2026-01-28 => 28 January 2026 @@ -5875,448 +5897,483 @@ Why I have not tested : too complicated https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/AlexNav73/CoreCraft&body=https://github.com/AlexNav73/CoreCraft -19) [https://github.com/atc-net/atc-source-generators]( https://github.com/atc-net/atc-source-generators) , https://github.com/atc-net/atc-source-generators +19) [https://github.com/ANcpLua/ErrorOrX]( https://github.com/ANcpLua/ErrorOrX) , https://github.com/ANcpLua/ErrorOrX + +Why I have not tested : later + +https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/ANcpLua/ErrorOrX&body=https://github.com/ANcpLua/ErrorOrX + + +20) [https://github.com/atc-net/atc-source-generators]( https://github.com/atc-net/atc-source-generators) , https://github.com/atc-net/atc-source-generators Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/atc-net/atc-source-generators&body=https://github.com/atc-net/atc-source-generators -20) [https://github.com/Atoen/TextLocalizer]( https://github.com/Atoen/TextLocalizer) , https://github.com/Atoen/TextLocalizer +21) [https://github.com/Atoen/TextLocalizer]( https://github.com/Atoen/TextLocalizer) , https://github.com/Atoen/TextLocalizer Why I have not tested : too complicated https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/Atoen/TextLocalizer&body=https://github.com/Atoen/TextLocalizer -21) [https://github.com/Aymen83/AspectWeaver]( https://github.com/Aymen83/AspectWeaver) , https://github.com/Aymen83/AspectWeaver +22) [https://github.com/Aymen83/AspectWeaver]( https://github.com/Aymen83/AspectWeaver) , https://github.com/Aymen83/AspectWeaver Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/Aymen83/AspectWeaver&body=https://github.com/Aymen83/AspectWeaver -22) [https://github.com/bjornhellander/TestInheritanceGenerator]( https://github.com/bjornhellander/TestInheritanceGenerator) , https://github.com/bjornhellander/TestInheritanceGenerator +23) [https://github.com/bjornhellander/TestInheritanceGenerator]( https://github.com/bjornhellander/TestInheritanceGenerator) , https://github.com/bjornhellander/TestInheritanceGenerator Why I have not tested : too complicated https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/bjornhellander/TestInheritanceGenerator&body=https://github.com/bjornhellander/TestInheritanceGenerator -23) [https://github.com/borisdj/CsCodeGenerator]( https://github.com/borisdj/CsCodeGenerator) , https://github.com/borisdj/CsCodeGenerator +24) [https://github.com/borisdj/CsCodeGenerator]( https://github.com/borisdj/CsCodeGenerator) , https://github.com/borisdj/CsCodeGenerator Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/borisdj/CsCodeGenerator&body=https://github.com/borisdj/CsCodeGenerator -24) [https://github.com/buchmiet/FastFsm]( https://github.com/buchmiet/FastFsm) , https://github.com/buchmiet/FastFsm +25) [https://github.com/buchmiet/FastFsm]( https://github.com/buchmiet/FastFsm) , https://github.com/buchmiet/FastFsm Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/buchmiet/FastFsm&body=https://github.com/buchmiet/FastFsm -25) [https://github.com/chickensoft-games/LogicBlocks]( https://github.com/chickensoft-games/LogicBlocks) , https://github.com/chickensoft-games/LogicBlocks +26) [https://github.com/chickensoft-games/LogicBlocks]( https://github.com/chickensoft-games/LogicBlocks) , https://github.com/chickensoft-games/LogicBlocks Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/chickensoft-games/LogicBlocks&body=https://github.com/chickensoft-games/LogicBlocks -26) [https://github.com/dgmjr-io/InterfaceGenerator]( https://github.com/dgmjr-io/InterfaceGenerator) , https://github.com/dgmjr-io/InterfaceGenerator +27) [https://github.com/dgmjr-io/InterfaceGenerator]( https://github.com/dgmjr-io/InterfaceGenerator) , https://github.com/dgmjr-io/InterfaceGenerator Why I have not tested : issue opened https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/dgmjr-io/InterfaceGenerator&body=https://github.com/dgmjr-io/InterfaceGenerator -27) [https://github.com/eddievelasquez/IntercodeToolbox]( https://github.com/eddievelasquez/IntercodeToolbox) , https://github.com/eddievelasquez/IntercodeToolbox +28) [https://github.com/eddievelasquez/IntercodeToolbox]( https://github.com/eddievelasquez/IntercodeToolbox) , https://github.com/eddievelasquez/IntercodeToolbox Why I have not tested : too complicated https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/eddievelasquez/IntercodeToolbox&body=https://github.com/eddievelasquez/IntercodeToolbox -28) [https://github.com/FoundatioFx/Foundatio.Mediator]( https://github.com/FoundatioFx/Foundatio.Mediator) , https://github.com/FoundatioFx/Foundatio.Mediator +29) [https://github.com/FoundatioFx/Foundatio.Mediator]( https://github.com/FoundatioFx/Foundatio.Mediator) , https://github.com/FoundatioFx/Foundatio.Mediator Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/FoundatioFx/Foundatio.Mediator&body=https://github.com/FoundatioFx/Foundatio.Mediator -29) [https://github.com/GaoNian-NET/MapperToolkit]( https://github.com/GaoNian-NET/MapperToolkit) , https://github.com/GaoNian-NET/MapperToolkit +30) [https://github.com/GaoNian-NET/MapperToolkit]( https://github.com/GaoNian-NET/MapperToolkit) , https://github.com/GaoNian-NET/MapperToolkit Why I have not tested : issue opened https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/GaoNian-NET/MapperToolkit&body=https://github.com/GaoNian-NET/MapperToolkit -30) [https://github.com/IeuanWalker/MinimalApi.Endpoints/]( https://github.com/IeuanWalker/MinimalApi.Endpoints/) , https://github.com/IeuanWalker/MinimalApi.Endpoints/ +31) [https://github.com/IeuanWalker/MinimalApi.Endpoints/]( https://github.com/IeuanWalker/MinimalApi.Endpoints/) , https://github.com/IeuanWalker/MinimalApi.Endpoints/ Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/IeuanWalker/MinimalApi.Endpoints/&body=https://github.com/IeuanWalker/MinimalApi.Endpoints/ -31) [https://github.com/inputfalken/Dynatello]( https://github.com/inputfalken/Dynatello) , https://github.com/inputfalken/Dynatello +32) [https://github.com/inputfalken/Dynatello]( https://github.com/inputfalken/Dynatello) , https://github.com/inputfalken/Dynatello Why I have not tested : too complicated https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/inputfalken/Dynatello&body=https://github.com/inputfalken/Dynatello -32) [https://github.com/ionite34/MinimalApiMapper]( https://github.com/ionite34/MinimalApiMapper) , https://github.com/ionite34/MinimalApiMapper +33) [https://github.com/ionite34/MinimalApiMapper]( https://github.com/ionite34/MinimalApiMapper) , https://github.com/ionite34/MinimalApiMapper Why I have not tested : own idea where to generate files, so overwrites https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/ionite34/MinimalApiMapper&body=https://github.com/ionite34/MinimalApiMapper -33) [https://github.com/JasonBock/CslaGeneratorSerialization]( https://github.com/JasonBock/CslaGeneratorSerialization) , https://github.com/JasonBock/CslaGeneratorSerialization +34) [https://github.com/JasonBock/CslaGeneratorSerialization]( https://github.com/JasonBock/CslaGeneratorSerialization) , https://github.com/JasonBock/CslaGeneratorSerialization Why I have not tested : too complicated https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/JasonBock/CslaGeneratorSerialization&body=https://github.com/JasonBock/CslaGeneratorSerialization -34) [https://github.com/MoslemBenDhaou/DataSurface]( https://github.com/MoslemBenDhaou/DataSurface) , https://github.com/MoslemBenDhaou/DataSurface +35) [https://github.com/MoslemBenDhaou/DataSurface]( https://github.com/MoslemBenDhaou/DataSurface) , https://github.com/MoslemBenDhaou/DataSurface Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/MoslemBenDhaou/DataSurface&body=https://github.com/MoslemBenDhaou/DataSurface -35) [https://github.com/OrgEleCho/EleCho.Internationalization]( https://github.com/OrgEleCho/EleCho.Internationalization) , https://github.com/OrgEleCho/EleCho.Internationalization +36) [https://github.com/mu-dawood/EasyValidate]( https://github.com/mu-dawood/EasyValidate) , https://github.com/mu-dawood/EasyValidate + +Why I have not tested : later + +https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/mu-dawood/EasyValidate&body=https://github.com/mu-dawood/EasyValidate + + +37) [https://github.com/nuskey8/Csv-CSharp]( https://github.com/nuskey8/Csv-CSharp) , https://github.com/nuskey8/Csv-CSharp + +Why I have not tested : later + +https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/nuskey8/Csv-CSharp&body=https://github.com/nuskey8/Csv-CSharp + + +38) [https://github.com/OrgEleCho/EleCho.Internationalization]( https://github.com/OrgEleCho/EleCho.Internationalization) , https://github.com/OrgEleCho/EleCho.Internationalization Why I have not tested : issue opened https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/OrgEleCho/EleCho.Internationalization&body=https://github.com/OrgEleCho/EleCho.Internationalization -36) [https://github.com/pierre3/PlantUmlClassDiagramGenerator]( https://github.com/pierre3/PlantUmlClassDiagramGenerator) , https://github.com/pierre3/PlantUmlClassDiagramGenerator +39) [https://github.com/pekspro/DataAnnotationValuesExtractor]( https://github.com/pekspro/DataAnnotationValuesExtractor) , https://github.com/pekspro/DataAnnotationValuesExtractor + +Why I have not tested : later + +https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/pekspro/DataAnnotationValuesExtractor&body=https://github.com/pekspro/DataAnnotationValuesExtractor + + +40) [https://github.com/pierre3/PlantUmlClassDiagramGenerator]( https://github.com/pierre3/PlantUmlClassDiagramGenerator) , https://github.com/pierre3/PlantUmlClassDiagramGenerator Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/pierre3/PlantUmlClassDiagramGenerator&body=https://github.com/pierre3/PlantUmlClassDiagramGenerator -37) [https://github.com/stbychkov/AutoLoggerMessage]( https://github.com/stbychkov/AutoLoggerMessage) , https://github.com/stbychkov/AutoLoggerMessage +41) [https://github.com/sebastienros/comptime]( https://github.com/sebastienros/comptime) , https://github.com/sebastienros/comptime + +Why I have not tested : later + +https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/sebastienros/comptime&body=https://github.com/sebastienros/comptime + + +42) [https://github.com/stbychkov/AutoLoggerMessage]( https://github.com/stbychkov/AutoLoggerMessage) , https://github.com/stbychkov/AutoLoggerMessage Why I have not tested : Microsoft have done same feature https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/stbychkov/AutoLoggerMessage&body=https://github.com/stbychkov/AutoLoggerMessage -38) [https://github.com/Stepami/visitor-net]( https://github.com/Stepami/visitor-net) , https://github.com/Stepami/visitor-net +43) [https://github.com/Stepami/visitor-net]( https://github.com/Stepami/visitor-net) , https://github.com/Stepami/visitor-net Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/Stepami/visitor-net&body=https://github.com/Stepami/visitor-net -39) [https://github.com/svee4/RequiredStaticMembers]( https://github.com/svee4/RequiredStaticMembers) , https://github.com/svee4/RequiredStaticMembers +44) [https://github.com/svee4/RequiredStaticMembers]( https://github.com/svee4/RequiredStaticMembers) , https://github.com/svee4/RequiredStaticMembers Why I have not tested : issue opened https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/svee4/RequiredStaticMembers&body=https://github.com/svee4/RequiredStaticMembers -40) [https://github.com/SzymonHalucha/Minerals.AutoCommands]( https://github.com/SzymonHalucha/Minerals.AutoCommands) , https://github.com/SzymonHalucha/Minerals.AutoCommands +45) [https://github.com/SzymonHalucha/Minerals.AutoCommands]( https://github.com/SzymonHalucha/Minerals.AutoCommands) , https://github.com/SzymonHalucha/Minerals.AutoCommands Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/SzymonHalucha/Minerals.AutoCommands&body=https://github.com/SzymonHalucha/Minerals.AutoCommands -41) [https://github.com/Teleopti/Saspect]( https://github.com/Teleopti/Saspect) , https://github.com/Teleopti/Saspect +46) [https://github.com/Teleopti/Saspect]( https://github.com/Teleopti/Saspect) , https://github.com/Teleopti/Saspect Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/Teleopti/Saspect&body=https://github.com/Teleopti/Saspect -42) [https://github.com/TheFo2sh/AsyncFlow]( https://github.com/TheFo2sh/AsyncFlow) , https://github.com/TheFo2sh/AsyncFlow +47) [https://github.com/TheFo2sh/AsyncFlow]( https://github.com/TheFo2sh/AsyncFlow) , https://github.com/TheFo2sh/AsyncFlow Why I have not tested : too complicated https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/TheFo2sh/AsyncFlow&body=https://github.com/TheFo2sh/AsyncFlow -43) [https://github.com/wieslawsoltes/ReactiveGenerator]( https://github.com/wieslawsoltes/ReactiveGenerator) , https://github.com/wieslawsoltes/ReactiveGenerator +48) [https://github.com/wieslawsoltes/ReactiveGenerator]( https://github.com/wieslawsoltes/ReactiveGenerator) , https://github.com/wieslawsoltes/ReactiveGenerator Why I have not tested : too complicated https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://github.com/wieslawsoltes/ReactiveGenerator&body=https://github.com/wieslawsoltes/ReactiveGenerator -44) [https://www.nuget.org/packages/Aspid.Generators.Helper]( https://www.nuget.org/packages/Aspid.Generators.Helper) , https://www.nuget.org/packages/Aspid.Generators.Helper +49) [https://www.nuget.org/packages/Aspid.Generators.Helper]( https://www.nuget.org/packages/Aspid.Generators.Helper) , https://www.nuget.org/packages/Aspid.Generators.Helper Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://www.nuget.org/packages/Aspid.Generators.Helper&body=https://www.nuget.org/packages/Aspid.Generators.Helper -45) [https://www.nuget.org/packages/AsyncTaskOrchestratorGenerator]( https://www.nuget.org/packages/AsyncTaskOrchestratorGenerator) , https://www.nuget.org/packages/AsyncTaskOrchestratorGenerator +50) [https://www.nuget.org/packages/AsyncTaskOrchestratorGenerator]( https://www.nuget.org/packages/AsyncTaskOrchestratorGenerator) , https://www.nuget.org/packages/AsyncTaskOrchestratorGenerator Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://www.nuget.org/packages/AsyncTaskOrchestratorGenerator&body=https://www.nuget.org/packages/AsyncTaskOrchestratorGenerator -46) [https://www.nuget.org/packages/Csla.Generator.AutoImplementProperties.CSharp/]( https://www.nuget.org/packages/Csla.Generator.AutoImplementProperties.CSharp/) , https://www.nuget.org/packages/Csla.Generator.AutoImplementProperties.CSharp/ +51) [https://www.nuget.org/packages/Csla.Generator.AutoImplementProperties.CSharp/]( https://www.nuget.org/packages/Csla.Generator.AutoImplementProperties.CSharp/) , https://www.nuget.org/packages/Csla.Generator.AutoImplementProperties.CSharp/ Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://www.nuget.org/packages/Csla.Generator.AutoImplementProperties.CSharp/&body=https://www.nuget.org/packages/Csla.Generator.AutoImplementProperties.CSharp/ -47) [https://www.nuget.org/packages/Csla.Generator.AutoSerialization.CSharp/]( https://www.nuget.org/packages/Csla.Generator.AutoSerialization.CSharp/) , https://www.nuget.org/packages/Csla.Generator.AutoSerialization.CSharp/ +52) [https://www.nuget.org/packages/Csla.Generator.AutoSerialization.CSharp/]( https://www.nuget.org/packages/Csla.Generator.AutoSerialization.CSharp/) , https://www.nuget.org/packages/Csla.Generator.AutoSerialization.CSharp/ Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://www.nuget.org/packages/Csla.Generator.AutoSerialization.CSharp/&body=https://www.nuget.org/packages/Csla.Generator.AutoSerialization.CSharp/ -48) [https://www.nuget.org/packages/CTMGenerator]( https://www.nuget.org/packages/CTMGenerator) , https://www.nuget.org/packages/CTMGenerator +53) [https://www.nuget.org/packages/CTMGenerator]( https://www.nuget.org/packages/CTMGenerator) , https://www.nuget.org/packages/CTMGenerator Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://www.nuget.org/packages/CTMGenerator&body=https://www.nuget.org/packages/CTMGenerator -49) [https://www.nuget.org/packages/DecoWeaver]( https://www.nuget.org/packages/DecoWeaver) , https://www.nuget.org/packages/DecoWeaver +54) [https://www.nuget.org/packages/DecoWeaver]( https://www.nuget.org/packages/DecoWeaver) , https://www.nuget.org/packages/DecoWeaver Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://www.nuget.org/packages/DecoWeaver&body=https://www.nuget.org/packages/DecoWeaver -50) [https://www.nuget.org/packages/JsonDerivedTypeGenerator]( https://www.nuget.org/packages/JsonDerivedTypeGenerator) , https://www.nuget.org/packages/JsonDerivedTypeGenerator +55) [https://www.nuget.org/packages/JsonDerivedTypeGenerator]( https://www.nuget.org/packages/JsonDerivedTypeGenerator) , https://www.nuget.org/packages/JsonDerivedTypeGenerator Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://www.nuget.org/packages/JsonDerivedTypeGenerator&body=https://www.nuget.org/packages/JsonDerivedTypeGenerator -51) [https://www.nuget.org/packages/MappingSourceGenerator]( https://www.nuget.org/packages/MappingSourceGenerator) , https://www.nuget.org/packages/MappingSourceGenerator +56) [https://www.nuget.org/packages/MappingSourceGenerator]( https://www.nuget.org/packages/MappingSourceGenerator) , https://www.nuget.org/packages/MappingSourceGenerator Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://www.nuget.org/packages/MappingSourceGenerator&body=https://www.nuget.org/packages/MappingSourceGenerator -52) [https://www.nuget.org/packages/Optikode.FluentMapper]( https://www.nuget.org/packages/Optikode.FluentMapper) , https://www.nuget.org/packages/Optikode.FluentMapper +57) [https://www.nuget.org/packages/Optikode.FluentMapper]( https://www.nuget.org/packages/Optikode.FluentMapper) , https://www.nuget.org/packages/Optikode.FluentMapper Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://www.nuget.org/packages/Optikode.FluentMapper&body=https://www.nuget.org/packages/Optikode.FluentMapper -53) [https://www.nuget.org/packages/SoapProxyPocoGenerator]( https://www.nuget.org/packages/SoapProxyPocoGenerator) , https://www.nuget.org/packages/SoapProxyPocoGenerator +58) [https://www.nuget.org/packages/SoapProxyPocoGenerator]( https://www.nuget.org/packages/SoapProxyPocoGenerator) , https://www.nuget.org/packages/SoapProxyPocoGenerator Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://www.nuget.org/packages/SoapProxyPocoGenerator&body=https://www.nuget.org/packages/SoapProxyPocoGenerator -54) [https://www.nuget.org/packages/TinyMediator]( https://www.nuget.org/packages/TinyMediator) , https://www.nuget.org/packages/TinyMediator +59) [https://www.nuget.org/packages/TinyMediator]( https://www.nuget.org/packages/TinyMediator) , https://www.nuget.org/packages/TinyMediator Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://www.nuget.org/packages/TinyMediator&body=https://www.nuget.org/packages/TinyMediator -55) [https://www.nuget.org/packages/TomRR.SourceGenerator.SettingsBinder]( https://www.nuget.org/packages/TomRR.SourceGenerator.SettingsBinder) , https://www.nuget.org/packages/TomRR.SourceGenerator.SettingsBinder +60) [https://www.nuget.org/packages/TomRR.SourceGenerator.SettingsBinder]( https://www.nuget.org/packages/TomRR.SourceGenerator.SettingsBinder) , https://www.nuget.org/packages/TomRR.SourceGenerator.SettingsBinder Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://www.nuget.org/packages/TomRR.SourceGenerator.SettingsBinder&body=https://www.nuget.org/packages/TomRR.SourceGenerator.SettingsBinder -56) [https://www.nuget.org/packages/X39.Roslyn.Property]( https://www.nuget.org/packages/X39.Roslyn.Property) , https://www.nuget.org/packages/X39.Roslyn.Property +61) [https://www.nuget.org/packages/X39.Roslyn.Property]( https://www.nuget.org/packages/X39.Roslyn.Property) , https://www.nuget.org/packages/X39.Roslyn.Property Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://www.nuget.org/packages/X39.Roslyn.Property&body=https://www.nuget.org/packages/X39.Roslyn.Property -57) [https://www.nuget.org/packages/ZeroReflection.Mapper.Generator/]( https://www.nuget.org/packages/ZeroReflection.Mapper.Generator/) , https://www.nuget.org/packages/ZeroReflection.Mapper.Generator/ +62) [https://www.nuget.org/packages/ZeroReflection.Mapper.Generator/]( https://www.nuget.org/packages/ZeroReflection.Mapper.Generator/) , https://www.nuget.org/packages/ZeroReflection.Mapper.Generator/ Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://www.nuget.org/packages/ZeroReflection.Mapper.Generator/&body=https://www.nuget.org/packages/ZeroReflection.Mapper.Generator/ -58) [https://www.nuget.org/packages/ZeroReflection.Mediator.Generator]( https://www.nuget.org/packages/ZeroReflection.Mediator.Generator) , https://www.nuget.org/packages/ZeroReflection.Mediator.Generator +63) [https://www.nuget.org/packages/ZeroReflection.Mediator.Generator]( https://www.nuget.org/packages/ZeroReflection.Mediator.Generator) , https://www.nuget.org/packages/ZeroReflection.Mediator.Generator Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=https://www.nuget.org/packages/ZeroReflection.Mediator.Generator&body=https://www.nuget.org/packages/ZeroReflection.Mediator.Generator -59) [Intellenum]( https://github.com/SteveDunn/Intellenum) , https://github.com/SteveDunn/Intellenum +64) [Intellenum]( https://github.com/SteveDunn/Intellenum) , https://github.com/SteveDunn/Intellenum Why I have not tested : not understand how to use https://github.com/ignatandrei/RSCG_Examples/issues/new?title=Intellenum&body=https://github.com/SteveDunn/Intellenum -60) [laker]( https://github.com/Lakerfield/Lakerfield.Rpc) , https://github.com/Lakerfield/Lakerfield.Rpc +65) [laker]( https://github.com/Lakerfield/Lakerfield.Rpc) , https://github.com/Lakerfield/Lakerfield.Rpc Why I have not tested : too complicated https://github.com/ignatandrei/RSCG_Examples/issues/new?title=laker&body=https://github.com/Lakerfield/Lakerfield.Rpc -61) [LoggingDecoratorGenerator]( https://github.com/DavidFineboym/LoggingDecoratorGenerator) , https://github.com/DavidFineboym/LoggingDecoratorGenerator +66) [LoggingDecoratorGenerator]( https://github.com/DavidFineboym/LoggingDecoratorGenerator) , https://github.com/DavidFineboym/LoggingDecoratorGenerator Why I have not tested : Microsoft have done same feature https://github.com/ignatandrei/RSCG_Examples/issues/new?title=LoggingDecoratorGenerator&body=https://github.com/DavidFineboym/LoggingDecoratorGenerator -62) [lucide-blazor]( https://github.com/brecht-vde/lucide-blazor/) , https://github.com/brecht-vde/lucide-blazor/ +67) [lucide-blazor]( https://github.com/brecht-vde/lucide-blazor/) , https://github.com/brecht-vde/lucide-blazor/ Why I have not tested : issue opened https://github.com/ignatandrei/RSCG_Examples/issues/new?title=lucide-blazor&body=https://github.com/brecht-vde/lucide-blazor/ -63) [ManagedDotnetProfiler]( https://github.com/kevingosse/ManagedDotnetProfiler) , https://github.com/kevingosse/ManagedDotnetProfiler +68) [ManagedDotnetProfiler]( https://github.com/kevingosse/ManagedDotnetProfiler) , https://github.com/kevingosse/ManagedDotnetProfiler Why I have not tested : too complicated https://github.com/ignatandrei/RSCG_Examples/issues/new?title=ManagedDotnetProfiler&body=https://github.com/kevingosse/ManagedDotnetProfiler -64) [Maui.BindableProperty.Generator]( https://github.com/rrmanzano/maui-bindableproperty-generator) , https://github.com/rrmanzano/maui-bindableproperty-generator +69) [Maui.BindableProperty.Generator]( https://github.com/rrmanzano/maui-bindableproperty-generator) , https://github.com/rrmanzano/maui-bindableproperty-generator Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=Maui.BindableProperty.Generator&body=https://github.com/rrmanzano/maui-bindableproperty-generator -65) [Minerals.AutoCQRS]( https://github.com/SzymonHalucha/Minerals.AutoCQRS) , https://github.com/SzymonHalucha/Minerals.AutoCQRS +70) [Minerals.AutoCQRS]( https://github.com/SzymonHalucha/Minerals.AutoCQRS) , https://github.com/SzymonHalucha/Minerals.AutoCQRS Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=Minerals.AutoCQRS&body=https://github.com/SzymonHalucha/Minerals.AutoCQRS -66) [Minerals.AutoDomain]( https://github.com/SzymonHalucha/Minerals.AutoDomain) , https://github.com/SzymonHalucha/Minerals.AutoDomain +71) [Minerals.AutoDomain]( https://github.com/SzymonHalucha/Minerals.AutoDomain) , https://github.com/SzymonHalucha/Minerals.AutoDomain Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=Minerals.AutoDomain&body=https://github.com/SzymonHalucha/Minerals.AutoDomain -67) [observable]( https://github.com/notanaverageman/Bindables) , https://github.com/notanaverageman/Bindables +72) [observable]( https://github.com/notanaverageman/Bindables) , https://github.com/notanaverageman/Bindables Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=observable&body=https://github.com/notanaverageman/Bindables -68) [PolySharp]( https://github.com/Sergio0694/PolySharp) , https://github.com/Sergio0694/PolySharp +73) [PolySharp]( https://github.com/Sergio0694/PolySharp) , https://github.com/Sergio0694/PolySharp Why I have not tested : too complicated https://github.com/ignatandrei/RSCG_Examples/issues/new?title=PolySharp&body=https://github.com/Sergio0694/PolySharp -69) [RazorGen]( https://github.com/dartk/RazorGen) , https://github.com/dartk/RazorGen +74) [RazorGen]( https://github.com/dartk/RazorGen) , https://github.com/dartk/RazorGen Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=RazorGen&body=https://github.com/dartk/RazorGen -70) [SerdeDn]( https://github.com/serdedotnet/serde) , https://github.com/serdedotnet/serde +75) [SerdeDn]( https://github.com/serdedotnet/serde) , https://github.com/serdedotnet/serde Why I have not tested : serializer. Done by MSFT with System.Text.Json https://github.com/ignatandrei/RSCG_Examples/issues/new?title=SerdeDn&body=https://github.com/serdedotnet/serde -71) [SogePoco]( https://github.com/d-p-y/SogePoco) , https://github.com/d-p-y/SogePoco +76) [SogePoco]( https://github.com/d-p-y/SogePoco) , https://github.com/d-p-y/SogePoco Why I have not tested : too complicated https://github.com/ignatandrei/RSCG_Examples/issues/new?title=SogePoco&body=https://github.com/d-p-y/SogePoco -72) [SourceCrafter.HttpServiceClientGenerator]( https://github.com/pedro-gilmora/SourceCrafter.HttpServiceClientGenerator/) , https://github.com/pedro-gilmora/SourceCrafter.HttpServiceClientGenerator/ +77) [SourceCrafter.HttpServiceClientGenerator]( https://github.com/pedro-gilmora/SourceCrafter.HttpServiceClientGenerator/) , https://github.com/pedro-gilmora/SourceCrafter.HttpServiceClientGenerator/ Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=SourceCrafter.HttpServiceClientGenerator&body=https://github.com/pedro-gilmora/SourceCrafter.HttpServiceClientGenerator/ -73) [ST.NSwag.ServerSourceGenerator]( https://github.com/s-tarasov/ST.NSwag.ServerSourceGenerator) , https://github.com/s-tarasov/ST.NSwag.ServerSourceGenerator +78) [ST.NSwag.ServerSourceGenerator]( https://github.com/s-tarasov/ST.NSwag.ServerSourceGenerator) , https://github.com/s-tarasov/ST.NSwag.ServerSourceGenerator Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=ST.NSwag.ServerSourceGenerator&body=https://github.com/s-tarasov/ST.NSwag.ServerSourceGenerator -74) [StrongInject]( https://github.com/YairHalberstadt/stronginject/) , https://github.com/YairHalberstadt/stronginject/ +79) [StrongInject]( https://github.com/YairHalberstadt/stronginject/) , https://github.com/YairHalberstadt/stronginject/ Why I have not tested : later https://github.com/ignatandrei/RSCG_Examples/issues/new?title=StrongInject&body=https://github.com/YairHalberstadt/stronginject/ -75) [TeuJson]( https://github.com/Terria-K/TeuJson) , https://github.com/Terria-K/TeuJson +80) [TeuJson]( https://github.com/Terria-K/TeuJson) , https://github.com/Terria-K/TeuJson Why I have not tested : json a class, was done in System.Text.Json https://github.com/ignatandrei/RSCG_Examples/issues/new?title=TeuJson&body=https://github.com/Terria-K/TeuJson -76) [Tinyhand]( https://github.com/archi-Doc/Tinyhand) , https://github.com/archi-Doc/Tinyhand +81) [Tinyhand]( https://github.com/archi-Doc/Tinyhand) , https://github.com/archi-Doc/Tinyhand Why I have not tested : tried, need documentation https://github.com/ignatandrei/RSCG_Examples/issues/new?title=Tinyhand&body=https://github.com/archi-Doc/Tinyhand -77) [TupleOverloadGenerator]( https://github.com/ProphetLamb/TupleOverloadGenerator) , https://github.com/ProphetLamb/TupleOverloadGenerator +82) [TupleOverloadGenerator]( https://github.com/ProphetLamb/TupleOverloadGenerator) , https://github.com/ProphetLamb/TupleOverloadGenerator Why I have not tested : too complicated https://github.com/ignatandrei/RSCG_Examples/issues/new?title=TupleOverloadGenerator&body=https://github.com/ProphetLamb/TupleOverloadGenerator -78) [TypealizR]( https://github.com/earloc/TypealizR) , https://github.com/earloc/TypealizR +83) [TypealizR]( https://github.com/earloc/TypealizR) , https://github.com/earloc/TypealizR Why I have not tested : depends on Microsoft.Extensions.Localization https://github.com/ignatandrei/RSCG_Examples/issues/new?title=TypealizR&body=https://github.com/earloc/TypealizR -79) [UnitTestBlazor]( https://github.com/bUnit-dev/bUnit) , https://github.com/bUnit-dev/bUnit +84) [UnitTestBlazor]( https://github.com/bUnit-dev/bUnit) , https://github.com/bUnit-dev/bUnit Why I have not tested : issue opened https://github.com/ignatandrei/RSCG_Examples/issues/new?title=UnitTestBlazor&body=https://github.com/bUnit-dev/bUnit -80) [ValueLink]( https://github.com/archi-Doc/ValueLink) , https://github.com/archi-Doc/ValueLink +85) [ValueLink]( https://github.com/archi-Doc/ValueLink) , https://github.com/archi-Doc/ValueLink Why I have not tested : too complicated https://github.com/ignatandrei/RSCG_Examples/issues/new?title=ValueLink&body=https://github.com/archi-Doc/ValueLink -81) [VisitorPatternGenerator]( https://github.com/hikarin522/VisitorPatternGenerator/) , https://github.com/hikarin522/VisitorPatternGenerator/ +86) [VisitorPatternGenerator]( https://github.com/hikarin522/VisitorPatternGenerator/) , https://github.com/hikarin522/VisitorPatternGenerator/ Why I have not tested : issue opened https://github.com/ignatandrei/RSCG_Examples/issues/new?title=VisitorPatternGenerator&body=https://github.com/hikarin522/VisitorPatternGenerator/ -82) [WrapperValueObject]( https://github.com/martinothamar/WrapperValueObject) , https://github.com/martinothamar/WrapperValueObject +87) [WrapperValueObject]( https://github.com/martinothamar/WrapperValueObject) , https://github.com/martinothamar/WrapperValueObject Why I have not tested : not maintained as in readme diff --git a/later.md b/later.md index 13f230f72..dc5f6c72c 100644 --- a/later.md +++ b/later.md @@ -1,6 +1,6 @@ # Just later -## Latest Update : 2026-01-28 => 28 January 2026 +## Latest Update : 2026-02-01 => 01 February 2026 @@ -38,211 +38,241 @@ Why I have not tested : later -6) [https://github.com/atc-net/atc-source-generators]( https://github.com/atc-net/atc-source-generators) , https://github.com/atc-net/atc-source-generators +6) [https://github.com/ANcpLua/ErrorOrX]( https://github.com/ANcpLua/ErrorOrX) , https://github.com/ANcpLua/ErrorOrX Why I have not tested : later -7) [https://github.com/Aymen83/AspectWeaver]( https://github.com/Aymen83/AspectWeaver) , https://github.com/Aymen83/AspectWeaver +7) [https://github.com/atc-net/atc-source-generators]( https://github.com/atc-net/atc-source-generators) , https://github.com/atc-net/atc-source-generators Why I have not tested : later -8) [https://github.com/borisdj/CsCodeGenerator]( https://github.com/borisdj/CsCodeGenerator) , https://github.com/borisdj/CsCodeGenerator +8) [https://github.com/Aymen83/AspectWeaver]( https://github.com/Aymen83/AspectWeaver) , https://github.com/Aymen83/AspectWeaver Why I have not tested : later -9) [https://github.com/buchmiet/FastFsm]( https://github.com/buchmiet/FastFsm) , https://github.com/buchmiet/FastFsm +9) [https://github.com/borisdj/CsCodeGenerator]( https://github.com/borisdj/CsCodeGenerator) , https://github.com/borisdj/CsCodeGenerator Why I have not tested : later -10) [https://github.com/chickensoft-games/LogicBlocks]( https://github.com/chickensoft-games/LogicBlocks) , https://github.com/chickensoft-games/LogicBlocks +10) [https://github.com/buchmiet/FastFsm]( https://github.com/buchmiet/FastFsm) , https://github.com/buchmiet/FastFsm Why I have not tested : later -11) [https://github.com/FoundatioFx/Foundatio.Mediator]( https://github.com/FoundatioFx/Foundatio.Mediator) , https://github.com/FoundatioFx/Foundatio.Mediator +11) [https://github.com/chickensoft-games/LogicBlocks]( https://github.com/chickensoft-games/LogicBlocks) , https://github.com/chickensoft-games/LogicBlocks Why I have not tested : later -12) [https://github.com/IeuanWalker/MinimalApi.Endpoints/]( https://github.com/IeuanWalker/MinimalApi.Endpoints/) , https://github.com/IeuanWalker/MinimalApi.Endpoints/ +12) [https://github.com/FoundatioFx/Foundatio.Mediator]( https://github.com/FoundatioFx/Foundatio.Mediator) , https://github.com/FoundatioFx/Foundatio.Mediator Why I have not tested : later -13) [https://github.com/MoslemBenDhaou/DataSurface]( https://github.com/MoslemBenDhaou/DataSurface) , https://github.com/MoslemBenDhaou/DataSurface +13) [https://github.com/IeuanWalker/MinimalApi.Endpoints/]( https://github.com/IeuanWalker/MinimalApi.Endpoints/) , https://github.com/IeuanWalker/MinimalApi.Endpoints/ Why I have not tested : later -14) [https://github.com/pierre3/PlantUmlClassDiagramGenerator]( https://github.com/pierre3/PlantUmlClassDiagramGenerator) , https://github.com/pierre3/PlantUmlClassDiagramGenerator +14) [https://github.com/MoslemBenDhaou/DataSurface]( https://github.com/MoslemBenDhaou/DataSurface) , https://github.com/MoslemBenDhaou/DataSurface Why I have not tested : later -15) [https://github.com/Stepami/visitor-net]( https://github.com/Stepami/visitor-net) , https://github.com/Stepami/visitor-net +15) [https://github.com/mu-dawood/EasyValidate]( https://github.com/mu-dawood/EasyValidate) , https://github.com/mu-dawood/EasyValidate Why I have not tested : later -16) [https://github.com/SzymonHalucha/Minerals.AutoCommands]( https://github.com/SzymonHalucha/Minerals.AutoCommands) , https://github.com/SzymonHalucha/Minerals.AutoCommands +16) [https://github.com/nuskey8/Csv-CSharp]( https://github.com/nuskey8/Csv-CSharp) , https://github.com/nuskey8/Csv-CSharp Why I have not tested : later -17) [https://github.com/Teleopti/Saspect]( https://github.com/Teleopti/Saspect) , https://github.com/Teleopti/Saspect +17) [https://github.com/pekspro/DataAnnotationValuesExtractor]( https://github.com/pekspro/DataAnnotationValuesExtractor) , https://github.com/pekspro/DataAnnotationValuesExtractor Why I have not tested : later -18) [https://www.nuget.org/packages/Aspid.Generators.Helper]( https://www.nuget.org/packages/Aspid.Generators.Helper) , https://www.nuget.org/packages/Aspid.Generators.Helper +18) [https://github.com/pierre3/PlantUmlClassDiagramGenerator]( https://github.com/pierre3/PlantUmlClassDiagramGenerator) , https://github.com/pierre3/PlantUmlClassDiagramGenerator Why I have not tested : later -19) [https://www.nuget.org/packages/AsyncTaskOrchestratorGenerator]( https://www.nuget.org/packages/AsyncTaskOrchestratorGenerator) , https://www.nuget.org/packages/AsyncTaskOrchestratorGenerator +19) [https://github.com/sebastienros/comptime]( https://github.com/sebastienros/comptime) , https://github.com/sebastienros/comptime Why I have not tested : later -20) [https://www.nuget.org/packages/Csla.Generator.AutoImplementProperties.CSharp/]( https://www.nuget.org/packages/Csla.Generator.AutoImplementProperties.CSharp/) , https://www.nuget.org/packages/Csla.Generator.AutoImplementProperties.CSharp/ +20) [https://github.com/Stepami/visitor-net]( https://github.com/Stepami/visitor-net) , https://github.com/Stepami/visitor-net Why I have not tested : later -21) [https://www.nuget.org/packages/Csla.Generator.AutoSerialization.CSharp/]( https://www.nuget.org/packages/Csla.Generator.AutoSerialization.CSharp/) , https://www.nuget.org/packages/Csla.Generator.AutoSerialization.CSharp/ +21) [https://github.com/SzymonHalucha/Minerals.AutoCommands]( https://github.com/SzymonHalucha/Minerals.AutoCommands) , https://github.com/SzymonHalucha/Minerals.AutoCommands Why I have not tested : later -22) [https://www.nuget.org/packages/CTMGenerator]( https://www.nuget.org/packages/CTMGenerator) , https://www.nuget.org/packages/CTMGenerator +22) [https://github.com/Teleopti/Saspect]( https://github.com/Teleopti/Saspect) , https://github.com/Teleopti/Saspect Why I have not tested : later -23) [https://www.nuget.org/packages/DecoWeaver]( https://www.nuget.org/packages/DecoWeaver) , https://www.nuget.org/packages/DecoWeaver +23) [https://www.nuget.org/packages/Aspid.Generators.Helper]( https://www.nuget.org/packages/Aspid.Generators.Helper) , https://www.nuget.org/packages/Aspid.Generators.Helper Why I have not tested : later -24) [https://www.nuget.org/packages/JsonDerivedTypeGenerator]( https://www.nuget.org/packages/JsonDerivedTypeGenerator) , https://www.nuget.org/packages/JsonDerivedTypeGenerator +24) [https://www.nuget.org/packages/AsyncTaskOrchestratorGenerator]( https://www.nuget.org/packages/AsyncTaskOrchestratorGenerator) , https://www.nuget.org/packages/AsyncTaskOrchestratorGenerator Why I have not tested : later -25) [https://www.nuget.org/packages/MappingSourceGenerator]( https://www.nuget.org/packages/MappingSourceGenerator) , https://www.nuget.org/packages/MappingSourceGenerator +25) [https://www.nuget.org/packages/Csla.Generator.AutoImplementProperties.CSharp/]( https://www.nuget.org/packages/Csla.Generator.AutoImplementProperties.CSharp/) , https://www.nuget.org/packages/Csla.Generator.AutoImplementProperties.CSharp/ Why I have not tested : later -26) [https://www.nuget.org/packages/Optikode.FluentMapper]( https://www.nuget.org/packages/Optikode.FluentMapper) , https://www.nuget.org/packages/Optikode.FluentMapper +26) [https://www.nuget.org/packages/Csla.Generator.AutoSerialization.CSharp/]( https://www.nuget.org/packages/Csla.Generator.AutoSerialization.CSharp/) , https://www.nuget.org/packages/Csla.Generator.AutoSerialization.CSharp/ Why I have not tested : later -27) [https://www.nuget.org/packages/SoapProxyPocoGenerator]( https://www.nuget.org/packages/SoapProxyPocoGenerator) , https://www.nuget.org/packages/SoapProxyPocoGenerator +27) [https://www.nuget.org/packages/CTMGenerator]( https://www.nuget.org/packages/CTMGenerator) , https://www.nuget.org/packages/CTMGenerator Why I have not tested : later -28) [https://www.nuget.org/packages/TinyMediator]( https://www.nuget.org/packages/TinyMediator) , https://www.nuget.org/packages/TinyMediator +28) [https://www.nuget.org/packages/DecoWeaver]( https://www.nuget.org/packages/DecoWeaver) , https://www.nuget.org/packages/DecoWeaver Why I have not tested : later -29) [https://www.nuget.org/packages/TomRR.SourceGenerator.SettingsBinder]( https://www.nuget.org/packages/TomRR.SourceGenerator.SettingsBinder) , https://www.nuget.org/packages/TomRR.SourceGenerator.SettingsBinder +29) [https://www.nuget.org/packages/JsonDerivedTypeGenerator]( https://www.nuget.org/packages/JsonDerivedTypeGenerator) , https://www.nuget.org/packages/JsonDerivedTypeGenerator Why I have not tested : later -30) [https://www.nuget.org/packages/X39.Roslyn.Property]( https://www.nuget.org/packages/X39.Roslyn.Property) , https://www.nuget.org/packages/X39.Roslyn.Property +30) [https://www.nuget.org/packages/MappingSourceGenerator]( https://www.nuget.org/packages/MappingSourceGenerator) , https://www.nuget.org/packages/MappingSourceGenerator Why I have not tested : later -31) [https://www.nuget.org/packages/ZeroReflection.Mapper.Generator/]( https://www.nuget.org/packages/ZeroReflection.Mapper.Generator/) , https://www.nuget.org/packages/ZeroReflection.Mapper.Generator/ +31) [https://www.nuget.org/packages/Optikode.FluentMapper]( https://www.nuget.org/packages/Optikode.FluentMapper) , https://www.nuget.org/packages/Optikode.FluentMapper Why I have not tested : later -32) [https://www.nuget.org/packages/ZeroReflection.Mediator.Generator]( https://www.nuget.org/packages/ZeroReflection.Mediator.Generator) , https://www.nuget.org/packages/ZeroReflection.Mediator.Generator +32) [https://www.nuget.org/packages/SoapProxyPocoGenerator]( https://www.nuget.org/packages/SoapProxyPocoGenerator) , https://www.nuget.org/packages/SoapProxyPocoGenerator Why I have not tested : later -33) [Maui.BindableProperty.Generator]( https://github.com/rrmanzano/maui-bindableproperty-generator) , https://github.com/rrmanzano/maui-bindableproperty-generator +33) [https://www.nuget.org/packages/TinyMediator]( https://www.nuget.org/packages/TinyMediator) , https://www.nuget.org/packages/TinyMediator Why I have not tested : later -34) [Minerals.AutoCQRS]( https://github.com/SzymonHalucha/Minerals.AutoCQRS) , https://github.com/SzymonHalucha/Minerals.AutoCQRS +34) [https://www.nuget.org/packages/TomRR.SourceGenerator.SettingsBinder]( https://www.nuget.org/packages/TomRR.SourceGenerator.SettingsBinder) , https://www.nuget.org/packages/TomRR.SourceGenerator.SettingsBinder Why I have not tested : later -35) [Minerals.AutoDomain]( https://github.com/SzymonHalucha/Minerals.AutoDomain) , https://github.com/SzymonHalucha/Minerals.AutoDomain +35) [https://www.nuget.org/packages/X39.Roslyn.Property]( https://www.nuget.org/packages/X39.Roslyn.Property) , https://www.nuget.org/packages/X39.Roslyn.Property Why I have not tested : later -36) [observable]( https://github.com/notanaverageman/Bindables) , https://github.com/notanaverageman/Bindables +36) [https://www.nuget.org/packages/ZeroReflection.Mapper.Generator/]( https://www.nuget.org/packages/ZeroReflection.Mapper.Generator/) , https://www.nuget.org/packages/ZeroReflection.Mapper.Generator/ Why I have not tested : later -37) [RazorGen]( https://github.com/dartk/RazorGen) , https://github.com/dartk/RazorGen +37) [https://www.nuget.org/packages/ZeroReflection.Mediator.Generator]( https://www.nuget.org/packages/ZeroReflection.Mediator.Generator) , https://www.nuget.org/packages/ZeroReflection.Mediator.Generator Why I have not tested : later -38) [SourceCrafter.HttpServiceClientGenerator]( https://github.com/pedro-gilmora/SourceCrafter.HttpServiceClientGenerator/) , https://github.com/pedro-gilmora/SourceCrafter.HttpServiceClientGenerator/ +38) [Maui.BindableProperty.Generator]( https://github.com/rrmanzano/maui-bindableproperty-generator) , https://github.com/rrmanzano/maui-bindableproperty-generator Why I have not tested : later -39) [ST.NSwag.ServerSourceGenerator]( https://github.com/s-tarasov/ST.NSwag.ServerSourceGenerator) , https://github.com/s-tarasov/ST.NSwag.ServerSourceGenerator +39) [Minerals.AutoCQRS]( https://github.com/SzymonHalucha/Minerals.AutoCQRS) , https://github.com/SzymonHalucha/Minerals.AutoCQRS Why I have not tested : later -40) [StrongInject]( https://github.com/YairHalberstadt/stronginject/) , https://github.com/YairHalberstadt/stronginject/ +40) [Minerals.AutoDomain]( https://github.com/SzymonHalucha/Minerals.AutoDomain) , https://github.com/SzymonHalucha/Minerals.AutoDomain + +Why I have not tested : later + + + +41) [observable]( https://github.com/notanaverageman/Bindables) , https://github.com/notanaverageman/Bindables + +Why I have not tested : later + + + +42) [RazorGen]( https://github.com/dartk/RazorGen) , https://github.com/dartk/RazorGen + +Why I have not tested : later + + + +43) [SourceCrafter.HttpServiceClientGenerator]( https://github.com/pedro-gilmora/SourceCrafter.HttpServiceClientGenerator/) , https://github.com/pedro-gilmora/SourceCrafter.HttpServiceClientGenerator/ + +Why I have not tested : later + + + +44) [ST.NSwag.ServerSourceGenerator]( https://github.com/s-tarasov/ST.NSwag.ServerSourceGenerator) , https://github.com/s-tarasov/ST.NSwag.ServerSourceGenerator + +Why I have not tested : later + + + +45) [StrongInject]( https://github.com/YairHalberstadt/stronginject/) , https://github.com/YairHalberstadt/stronginject/ Why I have not tested : later diff --git a/v2/Generator/all.csv b/v2/Generator/all.csv index 419216675..f0b893c78 100644 --- a/v2/Generator/all.csv +++ b/v2/Generator/all.csv @@ -251,3 +251,4 @@ Nr,Key,Source,Category 250,Facet.Search, https://github.com/Tim-Maes/Facet.Search,Database 251,OrderedBuildersGenerator, https://github.com/Georgiy-Petrov/OrderedBuildersGenerator,Builder 252,RSCG_idempotency, https://github.com/ignatandrei/RSCG_idempotency,Idempotency +253,FastCloner, https://github.com/lofcz/FastCloner/,Clone diff --git a/v2/RSCGExamplesData/GeneratorDataRec.json b/v2/RSCGExamplesData/GeneratorDataRec.json index eeda72f96..3de08bb7c 100644 --- a/v2/RSCGExamplesData/GeneratorDataRec.json +++ b/v2/RSCGExamplesData/GeneratorDataRec.json @@ -1527,5 +1527,12 @@ "Category":45, "dtStart":"2026-01-28T00:00:00", "show":true + }, + { + + "ID":"FastCloner", + "Category":29, + "dtStart":"2026-02-01T00:00:00", + "show":true } ] \ No newline at end of file diff --git a/v2/RSCGExamplesData/NoExample.json b/v2/RSCGExamplesData/NoExample.json index 52666de4b..f2b0349c7 100644 --- a/v2/RSCGExamplesData/NoExample.json +++ b/v2/RSCGExamplesData/NoExample.json @@ -997,16 +997,6 @@ "name":"https://github.com/sebastienros/comptime", "why":"later" }, - { - "ID":254, - "name":"https://github.com/skarllot/EnumUtilities", - "why":"later" - }, - { - "ID":255, - "name":"https://github.com/lofcz/FastCloner/", - "why":"later" - }, {"ID":256, "name":"https://github.com/ANcpLua/ErrorOrX", "why":"later" diff --git a/v2/book/examples/FastCloner.html b/v2/book/examples/FastCloner.html new file mode 100644 index 000000000..50164d31d --- /dev/null +++ b/v2/book/examples/FastCloner.html @@ -0,0 +1,79 @@ + +

RSCG nr 253 : FastCloner

+ +

Info

+Nuget : https://www.nuget.org/packages/FastCloner/ + +

You can find more details at : https://github.com/lofcz/FastCloner/

+ +

Author :Matěj Štágl

+ +

Source: https://github.com/lofcz/FastCloner/

+ +

About

+ +Cloning objects + +

+ How to use +

+

+ Add reference to the FastCloner in the csproj +

+ + +

This was for me the starting code

+ +
+ I have coded the file Program.cs +
+ +
+ +
+ I have coded the file Person.cs +
+ +
+

And here are the generated files

+ +
+ The file generated is ClonableAttribute.g.cs +
+ + +
+ The file generated is CloneIgnoreAttribute.g.cs +
+ + +
+ The file generated is IClonable.g.cs +
+ + +
+ The file generated is Person.g.cs +
+ + +
+ The file generated is CloneData_Person_FastDeepClone.g.cs +
+ + +

+ You can download the code and this page as pdf from + + https://ignatandrei.github.io/RSCG_Examples/v2/docs/FastCloner + +

+ + +

+ You can see the whole list at + + https://ignatandrei.github.io/RSCG_Examples/v2/docs/List-of-RSCG + +

+ diff --git a/v2/book/list.html b/v2/book/list.html index d94801c1a..61b5f45b6 100644 --- a/v2/book/list.html +++ b/v2/book/list.html @@ -17,7 +17,7 @@

-This is the list of 252 RSCG with examples => +This is the list of 253 RSCG with examples =>

@@ -1034,6 +1034,10 @@

+ + + +
252 RSCG_idempotency
253FastCloner
diff --git a/v2/book/pandocHTML.yaml b/v2/book/pandocHTML.yaml index 107de6632..dd50d4b06 100644 --- a/v2/book/pandocHTML.yaml +++ b/v2/book/pandocHTML.yaml @@ -266,6 +266,7 @@ input-files: - examples/Facet.Search.html - examples/OrderedBuildersGenerator.html - examples/RSCG_idempotency.html +- examples/FastCloner.html # or you may use input-file: with a single value # defaults: diff --git a/v2/rscg_examples/FastCloner/description.json b/v2/rscg_examples/FastCloner/description.json new file mode 100644 index 000000000..3b7489e83 --- /dev/null +++ b/v2/rscg_examples/FastCloner/description.json @@ -0,0 +1,22 @@ +{ + "generator":{ + "name":"FastCloner", + "nuget":[ + "https://www.nuget.org/packages/FastCloner/" + ], + "link":"https://github.com/lofcz/FastCloner/", + "author":"Matěj Štágl", + "source":"https://github.com/lofcz/FastCloner/" + }, + "data":{ + "goodFor":["Cloning objects"], + "csprojDemo":"CloneData.csproj", + "csFiles":["Program.cs","Person.cs"], + "excludeDirectoryGenerated":[""], + "includeAdditionalFiles":[""] + }, + "links":{ + "blog":"", + "video":"" + } +} \ No newline at end of file diff --git a/v2/rscg_examples/FastCloner/nuget.txt b/v2/rscg_examples/FastCloner/nuget.txt new file mode 100644 index 000000000..9ada3d75d --- /dev/null +++ b/v2/rscg_examples/FastCloner/nuget.txt @@ -0,0 +1 @@ +Fast deep cloning library for .NET 8+. Supports both deep and shallow cloning. Extensively tested, focused on performance and stability even on complicated object graphs. \ No newline at end of file diff --git a/v2/rscg_examples/FastCloner/readme.txt b/v2/rscg_examples/FastCloner/readme.txt new file mode 100644 index 000000000..d4bb1bb02 --- /dev/null +++ b/v2/rscg_examples/FastCloner/readme.txt @@ -0,0 +1,372 @@ +
+ +FastCloner + +# FastCloner + +**The fastest and most reliable .NET deep cloning library.** + +[![FastCloner](https://shields.io/nuget/v/FastCloner?v=304&icon=nuget&label=FastCloner)](https://www.nuget.org/packages/FastCloner) +[![FastCloner](https://shields.io/nuget/v/FastCloner.SourceGenerator?v=304&icon=nuget&label=FastCloner.SourceGenerator)](https://www.nuget.org/packages/FastCloner.SourceGenerator) +[![License:MIT](https://img.shields.io/badge/License-MIT-34D058.svg)](https://opensource.org/license/mit) + +The fastest deep cloning library, supporting anything from .NET 4.6 to modern .NET 10+ with no dependencies. FastCloner uses a unique source generator capable of analyzing object graphs and cloning objects without explicit annotations. For types that cannot be cloned, such as HttpClient, FastCloner uses a highly optimized reflection-based fallback. Zero dependencies, blazingly fast, built for developers who need cloning that _just works_. + +
+ +## ✨ Features + +- **The Fastest** - [Benchmarked](https://github.com/lofcz/FastCloner?tab=readme-ov-file#performance) to beat all other libraries with third-party independent benchmarks verifying the performance. **300x** speed-up vs `Newtonsoft.Json` and **160x** vs `System.Text.Json` +- **The Most Correct** - Cloning objects is hard: ``, `abstract`, immutables, read-only, pointers, circular dependencies, deeply nested graphs.. we have over [700 tests](https://github.com/lofcz/FastCloner/tree/next/FastCloner.Tests) verifying correct behavior in these cases and we are transparent about the [limitations](https://github.com/lofcz/FastCloner?tab=readme-ov-file#limitations) +- **Novel Algorithm** - FastCloner recognizes that certain cloning code cannot be generated in certain scenarios and uses highly optimized reflection-based approach instead for these types - this only happens for the members that need this, not entire objects +- **Zero-Overhead Abstractions** - The generator uses call site analysis to eliminate indirection via inlining of generated methods. This ensures the generated code behaves like a single optimized block, just as if you hand-wrote it for maximum performance. +- **Embeddable** - FastCloner has no dependencies outside the standard library. Source generator and reflection parts can be installed independently +- **Gentle & Caring** - FastCloner detects standard attributes like `[NonSerialized]` making it easy to try without polluting codebase with custom attributes. Type usage graph for generics is built automatically producing performant cloning code without manual annotations +- **Easy Integration** - `FastDeepClone()` for AOT cloning, `DeepClone()` for reflection cloning. That's it! +- **Production Ready** - Used by projects like [Jobbr](https://jobbr.readthedocs.io/en/latest), [TarkovSP](https://sp-tarkov.com), and [WinPaletter](https://github.com/Abdelrhman-AK/WinPaletter), with over [200K downloads on NuGet](https://www.nuget.org/packages/fastCloner#usedby-body-tab) +## Getting Started + +Install the package via NuGet: + +```powershell +dotnet add package FastCloner # Reflection +dotnet add package FastCloner.SourceGenerator # AOT +``` + +### Clone via Reflection + +```csharp +using FastCloner.Code; +var clone = FastCloner.FastCloner.DeepClone(new { Hello = "world", MyList = new List { 1 } }); +``` + +For convenience, add the following method to your project. We intentionally don't ship this extension to make switching from/to FastCloner easier: + +```cs +[return: NotNullIfNotNull(nameof(obj))] +public static T? DeepClone(this T? obj) +{ + return FastCloner.FastCloner.DeepClone(obj); +} +``` + +### Clone via Source Generator + +```cs +[FastClonerClonable] +public class GenericClass +{ + public T Value { get; set; } +} + +public class MyClass +{ + public string StrVal { get; set; } +} + +// [FastClonerClonable] is only required on types where you call .FastDeepClone() +var original = new GenericClass> { Value = new List { new MyClass { StrVal = "hello world" } } }; +var clone = original.FastDeepClone(); +``` + +## Advanced Usage + +### Customizing Clone Behavior + +FastCloner supports behavior attributes that control how types and members are cloned: + +| Behavior | Effect | +|----------|--------| +| `Clone` | Deep recursive copy | +| `Reference` | Return original instance unchanged | +| `Shallow` | `MemberwiseClone` without recursion | +| `Ignore` | Return `default` | + +#### Compile-time (Attributes) + +Apply attributes to **types** or **members**. Member-level attributes override type-level: + +```csharp +[FastClonerReference] // Type-level: all usages preserve reference +public class SharedService { } + +public class MyClass +{ + public SharedService Svc { get; set; } // Uses type-level → Reference + + [FastClonerBehavior(CloneBehavior.Clone)] // Member-level override → Clone + public SharedService ClonedSvc { get; set; } + + [FastClonerIgnore] // → null/default + public CancellationToken Token { get; set; } + + [FastClonerShallow] // → Reference copied directly + public ParentNode Parent { get; set; } +} +``` + +Shorthand attributes: `[FastClonerIgnore]`, `[FastClonerShallow]`, `[FastClonerReference]` +Explicit: `[FastClonerBehavior(CloneBehavior.X)]` + +#### Runtime (Reflection only) + +Configure type behavior dynamically. Runtime settings are checked **before** attributes: + +```csharp +FastCloner.FastCloner.SetTypeBehavior(CloneBehavior.Reference); +FastCloner.FastCloner.ClearTypeBehavior(); // Reset one +FastCloner.FastCloner.ClearAllTypeBehaviors(); // Reset all +``` + +> **Note**: Changing runtime behavior invalidates the cache. Try to configure once at startup, or use compile-time attributes when possible. + +#### Precedence (highest to lowest) + +1. Runtime `SetTypeBehavior()` +2. Member-level attribute +3. Type-level attribute on member's type +4. Default behavior + +### Cache Management + +```csharp +FastCloner.FastCloner.ClearCache(); // Free memory from reflection cache +``` + + +### Generic Classes and Abstract Types + +The source generator automatically discovers which concrete types your generic classes and abstract hierarchies are used with: + +**Generic types** - The generator scans your codebase for usages like `MyClass` or `MyClass` and generates specialized cloning code: + +```cs +[FastClonerClonable] +public class Container +{ + public T Value { get; set; } +} + +// Source generator finds this usage and generates cloning code for Container +var container = new Container { Value = 42 }; +var clone = container.FastDeepClone(); +``` + +**Abstract classes** - The generator automatically finds all concrete derived types in your codebase: + +```cs +[FastClonerClonable] +public abstract class Animal +{ + public string Name { get; set; } +} + +public class Dog : Animal +{ + public string Breed { get; set; } +} + +public class Cat : Animal +{ + public bool IsIndoor { get; set; } +} + +// Cloning via the abstract type works - the generator discovered Dog and Cat +Animal pet = new Dog { Name = "Buddy", Breed = "Labrador" }; +Animal clone = pet.FastDeepClone(); // Returns a cloned Dog +``` + +### Explicitly Including Types + +When a type is only used dynamically (not visible at compile time), use `[FastClonerInclude]` to ensure the generator creates cloning code for it: + +```cs +[FastClonerClonable] +[FastClonerInclude(typeof(Customer), typeof(Order))] // Include types used dynamically +public class Wrapper +{ + public T Value { get; set; } +} +``` + +For abstract classes, you can also use `[FastClonerInclude]` to add derived types that aren't in your codebase (e.g., from external assemblies): + +```cs +[FastClonerClonable] +[FastClonerInclude(typeof(ExternalPlugin))] // Add external derived types +public abstract class Plugin +{ + public string Name { get; set; } +} +``` + +### Custom Cloning Context + +For advanced scenarios, create a custom cloning context to explicitly register types you want to clone. This is useful when you need a centralized cloning entry point or want to clone types from external assemblies: + +```cs +public class Customer +{ + public string Name { get; set; } + public Address Address { get; set; } +} + +public class Address +{ + public string City { get; set; } +} + +// Create a context and register types to clone +[FastClonerRegister(typeof(Customer), typeof(Address))] +public partial class MyCloningContext : FastClonerContext { } +``` + +Using the context: +```cs +MyCloningContext ctx = new MyCloningContext(); + +// Clone with compile-time type safety +Customer clone = ctx.Clone(original); + +// Check if a type is handled by this context +bool handled = ctx.IsHandled(typeof(Customer)); // true + +// Try to clone (returns false for unregistered types) +if (ctx.TryClone(obj, out var cloned)) +{ + // Successfully cloned +} +``` + +### Nullability Trust + +The generator can be instructed to fully trust nullability annotations. When `[FastClonerTrustNullability]` attribute is applied, FastCloner will skip null checks for non-nullable reference types (e.g., `string` vs `string?`), assuming the contract is valid. + +```csharp +[FastClonerClonable] +[FastClonerTrustNullability] // Skip null checks for non-nullable members +public class HighPerformanceDto +{ + public string Id { get; set; } // No null check generated + public string? Details { get; set; } // Null check still generated +} +``` + +This eliminates branching and improves performance slightly. If a non-nullable property is actually null at runtime, this may result in a `NullReferenceException` in the generated code. + +### Safe Handles + +When you have a struct that acts as a handle to internal state or a singleton (where identity matters), use `[FastClonerSafeHandle]`. This tells FastCloner to shallow-copy the readonly fields instead of deep-cloning them, preserving the original internal references. + +```csharp +[FastClonerSafeHandle] +public struct MyHandle +{ + private readonly object _internalState; // Preserved (shared), not deep cloned + public int Value; // Cloned normally +} +``` + +This is the default behavior for system types like `System.Net.Http.Headers.HeaderDescriptor` to prevent breaking internal framework logic. Use this attribute if your custom structs behave similarly. + +### Identity Preservation + +By default, FastCloner prioritizes performance by not tracking object identity during cloning. This means if the same object instance appears multiple times in your graph, each reference becomes a separate clone. + +For scenarios where you need to preserve object identity (e.g., shared references should remain shared in the clone), use `[FastClonerPreserveIdentity]`: + +```csharp +[FastClonerClonable] +[FastClonerPreserveIdentity] // Enable identity tracking for this type +public class Document +{ + public User Author { get; set; } + public User LastEditor { get; set; } // May reference the same User as Author +} + +var doc = new Document { Author = user, LastEditor = user }; +var clone = doc.FastDeepClone(); +// clone.Author == clone.LastEditor (same cloned instance) +``` + +The attribute can be applied at type level or member level: + +```csharp +[FastClonerClonable] +public class Container +{ + // Only this member tracks identity + [FastClonerPreserveIdentity] + public List Nodes { get; set; } + + // This member clones without identity tracking (faster) + public List Items { get; set; } +} +``` + +You can also explicitly disable identity preservation for a member when the type has it enabled: + +```csharp +[FastClonerClonable] +[FastClonerPreserveIdentity] +public class Graph +{ + public Node Root { get; set; } + + [FastClonerPreserveIdentity(false)] // Opt out for this member + public List Labels { get; set; } +} +``` + +> **Note**: Identity preservation adds overhead for tracking seen objects. Circular references are always detected regardless of this setting. + +## Limitations + +- Cloning unmanaged resources, such as `IntPtr`s may result in side-effects, as there is no metadata for the length of buffers such pointers often point to. +- `ReadOnly` and `Immutable` collections are tested to behave well if they follow basic conventions. +- With reflection, cloning deeply nested objects switches from recursion to iterative approach on the fly. The threshold for this can be configured by changing `FastCloner.MaxRecursionDepth`, iterative approach is marginally slower. + +## Performance + +FastCloner is the _fastest_ deep cloning library. It was benchmarked against every library capable of cloning objects I've been able to find: +```md +BenchmarkDotNet v0.15.8, Windows 11 (10.0.26220.7271) +Intel Core i7-8700 CPU 3.20GHz (Max: 3.19GHz) (Coffee Lake), 1 CPU, 12 logical and 6 physical cores +.NET SDK 10.0.100 + +| Method | Mean | Error | StdDev | Median | Ratio | RatioSD | Rank | Gen0 | Gen1 | Allocated | Alloc Ratio | +|------------------- |------------:|-----------:|-----------:|------------:|-------:|--------:|-----:|-------:|-------:|----------:|------------:| +| FastCloner | 10.25 ns | 0.219 ns | 0.183 ns | 10.24 ns | 1.00 | 0.02 | 1 | 0.0115 | - | 72 B | 1.00 | +| DeepCopier | 23.37 ns | 0.448 ns | 0.582 ns | 23.29 ns | 2.28 | 0.07 | 2 | 0.0115 | - | 72 B | 1.00 | +| DeepCopy | 40.56 ns | 3.589 ns | 10.583 ns | 43.56 ns | 3.96 | 1.03 | 3 | 0.0115 | - | 72 B | 1.00 | +| DeepCopyExpression | 126.05 ns | 3.355 ns | 9.892 ns | 129.32 ns | 12.30 | 0.98 | 4 | 0.0356 | - | 224 B | 3.11 | +| AutoMapper | 135.07 ns | 6.097 ns | 17.976 ns | 143.16 ns | 13.18 | 1.76 | 5 | 0.0114 | - | 72 B | 1.00 | +| DeepCloner | 261.42 ns | 14.113 ns | 41.614 ns | 282.99 ns | 25.51 | 4.06 | 6 | 0.0367 | - | 232 B | 3.22 | +| ObjectCloner | 336.89 ns | 14.249 ns | 42.012 ns | 355.28 ns | 32.87 | 4.12 | 7 | 0.0534 | - | 336 B | 4.67 | +| MessagePack | 499.71 ns | 20.831 ns | 61.420 ns | 524.63 ns | 48.75 | 6.02 | 8 | 0.0315 | - | 200 B | 2.78 | +| ProtobufNet | 898.60 ns | 34.925 ns | 102.978 ns | 934.13 ns | 87.67 | 10.11 | 9 | 0.0782 | - | 496 B | 6.89 | +| NClone | 904.75 ns | 33.559 ns | 98.949 ns | 919.05 ns | 88.27 | 9.73 | 9 | 0.1488 | - | 936 B | 13.00 | +| SystemTextJson | 1,687.39 ns | 70.341 ns | 201.821 ns | 1,766.14 ns | 164.63 | 19.79 | 10 | 0.1755 | - | 1120 B | 15.56 | +| NewtonsoftJson | 3,147.66 ns | 109.097 ns | 321.676 ns | 3,269.96 ns | 307.10 | 31.67 | 11 | 0.7286 | 0.0038 | 4592 B | 63.78 | +| FastDeepCloner | 3,970.90 ns | 155.503 ns | 458.505 ns | 4,128.09 ns | 387.41 | 45.01 | 12 | 0.2060 | - | 1304 B | 18.11 | +| AnyCloneBenchmark | 5,102.40 ns | 239.089 ns | 704.959 ns | 5,370.93 ns | 497.81 | 68.98 | 13 | 0.9003 | - | 5656 B | 78.56 | +``` + +You can run the benchmark [locally](https://github.com/lofcz/FastCloner/blob/next/src/FastCloner.Benchmark/BenchMinimal.cs) to verify the results. There are also [third-party benchmarks](https://github.com/AnderssonPeter/Dolly?tab=readme-ov-file#benchmarks) in some of the competing libraries confirming these results. + +### Build Times & IDE Performance + +FastCloner's source generator is carefully engineered for zero impact on IDE responsiveness and swift build times. + +- **Tiered Caching**: We use `ForAttributeWithMetadataName` for highly efficient filtering and strictly separate syntax analysis from code generation. +- **Smart Models**: Roslyn symbols are immediately projected into lightweight, cache-friendly `TypeModel` records. The generator never holds onto compilation symbols, allowing the incremental pipeline to perfectly cache previous results. +- **No Compilation Trashing**: We avoid expensive `CompilationProvider` combinations that break generator caching. Code generation only re-runs when your data models actually change, not on every keystroke or unrelated edit. +- **Allocation Free**: `EquatableArray` collections ensure that change detection is instant and creates no garbage collection pressure. + +## Contributing + +If you are looking to add new functionality, please open an issue first to verify your intent is aligned with the scope of the project. The library is covered by over [700 tests](https://github.com/lofcz/FastCloner/tree/next/src/FastCloner.Tests), please run them against your work before proposing changes. When reporting issues, providing a minimal reproduction we can plug in as a new test greatly reduces turnaround time. + +## License + +This library is licensed under the [MIT](https://github.com/lofcz/FastCloner/blob/next/LICENSE) license. 💜 diff --git a/v2/rscg_examples/FastCloner/src/.tours/FastCloner.tour b/v2/rscg_examples/FastCloner/src/.tours/FastCloner.tour new file mode 100644 index 000000000..192ca1fea --- /dev/null +++ b/v2/rscg_examples/FastCloner/src/.tours/FastCloner.tour @@ -0,0 +1,60 @@ + +{ + "$schema": "https://aka.ms/codetour-schema", + "title": "FastCloner", + "steps": + [ + { + "file": "CloneData/CloneData.csproj", + "description": "First, we add Nuget [FastCloner](https://www.nuget.org/packages/FastCloner/) in csproj ", + "pattern": "FastCloner" + } + + ,{ + "file": "CloneData/Person.cs", + "description": "File Person.cs ", + "pattern": "this is the code" + } + + ,{ + "file": "CloneData/Program.cs", + "description": "File Program.cs \r\n>> dotnet run --project CloneData/CloneData.csproj ", + "pattern": "this is the code" + } + + + ,{ + "file": "CloneData/obj/GX/FastCloner.SourceGenerator/FastCloner.SourceGenerator.FastClonerIncrementalGenerator/CloneData_Person_FastDeepClone.g.cs", + "description": "Generated File 5 from 5 : CloneData_Person_FastDeepClone.g.cs ", + "line": 1 + } + + ,{ + "file": "CloneData/obj/GX/Dolly/Dolly.DollyGenerator/Person.g.cs", + "description": "Generated File 4 from 5 : Person.g.cs ", + "line": 1 + } + + ,{ + "file": "CloneData/obj/GX/Dolly/Dolly.DollyGenerator/IClonable.g.cs", + "description": "Generated File 3 from 5 : IClonable.g.cs ", + "line": 1 + } + + ,{ + "file": "CloneData/obj/GX/Dolly/Dolly.DollyGenerator/CloneIgnoreAttribute.g.cs", + "description": "Generated File 2 from 5 : CloneIgnoreAttribute.g.cs ", + "line": 1 + } + + ,{ + "file": "CloneData/obj/GX/Dolly/Dolly.DollyGenerator/ClonableAttribute.g.cs", + "description": "Generated File 1 from 5 : ClonableAttribute.g.cs ", + "line": 1 + } + + ], + + "ref": "main" + +} \ No newline at end of file diff --git a/v2/rscg_examples/FastCloner/src/CloneData.sln b/v2/rscg_examples/FastCloner/src/CloneData.sln new file mode 100644 index 000000000..3373619ab --- /dev/null +++ b/v2/rscg_examples/FastCloner/src/CloneData.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.13.35507.96 d17.13 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CloneData", "CloneData\CloneData.csproj", "{CA3E929D-2578-48A5-B098-13A7B4D81D03}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CA3E929D-2578-48A5-B098-13A7B4D81D03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CA3E929D-2578-48A5-B098-13A7B4D81D03}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CA3E929D-2578-48A5-B098-13A7B4D81D03}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CA3E929D-2578-48A5-B098-13A7B4D81D03}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {324EECCB-2C9E-452F-84B0-CCCD40DAA208} + EndGlobalSection +EndGlobal diff --git a/v2/rscg_examples/FastCloner/src/CloneData/CloneData.csproj b/v2/rscg_examples/FastCloner/src/CloneData/CloneData.csproj new file mode 100644 index 000000000..6c6a82264 --- /dev/null +++ b/v2/rscg_examples/FastCloner/src/CloneData/CloneData.csproj @@ -0,0 +1,18 @@ + + + + Exe + net9.0 + enable + enable + + + true + $(BaseIntermediateOutputPath)\GX + + + + + + + diff --git a/v2/rscg_examples/FastCloner/src/CloneData/Person.cs b/v2/rscg_examples/FastCloner/src/CloneData/Person.cs new file mode 100644 index 000000000..5b8e1d24c --- /dev/null +++ b/v2/rscg_examples/FastCloner/src/CloneData/Person.cs @@ -0,0 +1,14 @@ + +using FastCloner.SourceGenerator.Shared; + +namespace CloneData; +[FastClonerClonable] +public partial class Person +{ + public string FirstName { get; set; } = ""; + public string LastName { get; set; } = ""; + public int Age { get; set; } + public string Name() => $"{FirstName} {LastName}"; + + public Person[] Childs { get; set; } = []; +} diff --git a/v2/rscg_examples/FastCloner/src/CloneData/Program.cs b/v2/rscg_examples/FastCloner/src/CloneData/Program.cs new file mode 100644 index 000000000..eafcad3aa --- /dev/null +++ b/v2/rscg_examples/FastCloner/src/CloneData/Program.cs @@ -0,0 +1,9 @@ +using CloneData; + +Console.WriteLine("Hello, World!"); +Person p = new (); +p.FirstName = "Andrei"; +p.LastName = "Ignat"; +p.Age = 54; +var p1=p.FastDeepClone(); +Console.WriteLine(p1.Name()); \ No newline at end of file diff --git a/v2/rscg_examples/FastCloner/video.json b/v2/rscg_examples/FastCloner/video.json new file mode 100644 index 000000000..e06d50f74 --- /dev/null +++ b/v2/rscg_examples/FastCloner/video.json @@ -0,0 +1,39 @@ +{ + "scriptName": "FastCloner", + "steps": +[ + {"typeStep":"exec","arg":"clipchamp.exe launch"}, + {"typeStep":"text","arg": "Welcome to Roslyn Examples"}, + {"typeStep":"text","arg":"If you want to see more examples , see List Of RSCG"}, + {"typeStep":"browser","arg":"https://ignatandrei.github.io/RSCG_Examples/v2/docs/List-of-RSCG"}, + {"typeStep":"text","arg": "My name is Andrei Ignat and I am deeply fond of Roslyn Source Code Generator. "}, + +{"typeStep":"text","arg": "Today I will present FastCloner . Cloning objects ."}, +{"typeStep":"browser","arg":"https://www.nuget.org/packages/FastCloner/"}, +{"typeStep":"text","arg": "The whole example is here"}, +{"typeStep":"browser","arg":"https://ignatandrei.github.io/RSCG_Examples/v2/docs/FastCloner"}, +{"typeStep":"text","arg": "You can download the code from here"}, +{"typeStep":"browser","arg":"https://ignatandrei.github.io/RSCG_Examples/v2/docs/FastCloner#download-example-net--c-"}, +{"typeStep":"text","arg":"Here is the code downloaded "}, +{"typeStep":"exec","arg":"explorer.exe /select,D:\\gth\\RSCG_Examples\\v2\\rscg_examples\\FastCloner\\src\\CloneData.sln"}, +{"typeStep":"text","arg": "So , let's start the project with Visual Studio Code "}, +{"typeStep":"stepvscode","arg": "-n D:\\gth\\RSCG_Examples\\v2\\rscg_examples\\FastCloner\\src"}, + +{"typeStep":"text","arg": "To use it ,you will put the Nuget FastCloner into the csproj "}, + +{"typeStep":"stepvscode","arg": "-r -g D:\\gth\\RSCG_Examples\\v2\\rscg_examples\\FastCloner\\src\\CloneData\\CloneData.csproj"}, + +{"typeStep":"text","arg": "And now I will show you an example of using FastCloner"}, + +{"typeStep":"hide","arg": "now execute the tour in VSCode"}, +{"typeStep":"tour", "arg": "src/.tours/"}, +{"typeStep":"text","arg":" And I will execute the project"}, +{"typeStep":"showproj", "arg":"CloneData.csproj"}, +{"typeStep":"text","arg":" This concludes the project"}, +{"typeStep":"waitseconds","arg":"30"}, +{"typeStep":"text","arg": "Remember, you can download the code from here"}, +{"typeStep":"browser","arg":"https://ignatandrei.github.io/RSCG_Examples/v2/docs/FastCloner#download-example-net--c-", +SpeakTest=" "}, +{"typeStep":"waitseconds","arg":"30"}, +] +} diff --git "a/v2/rscg_examples_site/docs/Authors/Mat\304\233j_\305\240t\303\241gl.md" "b/v2/rscg_examples_site/docs/Authors/Mat\304\233j_\305\240t\303\241gl.md" new file mode 100644 index 000000000..bd8a4621c --- /dev/null +++ "b/v2/rscg_examples_site/docs/Authors/Mat\304\233j_\305\240t\303\241gl.md" @@ -0,0 +1,7 @@ +# Author : Matěj Štágl + +Number RSCG: 1 + + + 1 [FastCloner](/docs/FastCloner) [![Nuget](https://img.shields.io/nuget/dt/FastCloner?label=FastCloner)](https://www.nuget.org/packages/FastCloner/) ![GitHub Repo stars](https://img.shields.io/github/stars/lofcz/FastCloner?style=social) 2026-02-01 + diff --git a/v2/rscg_examples_site/docs/Categories/Clone.md b/v2/rscg_examples_site/docs/Categories/Clone.md index e510c5e16..67138806c 100644 --- a/v2/rscg_examples_site/docs/Categories/Clone.md +++ b/v2/rscg_examples_site/docs/Categories/Clone.md @@ -1,10 +1,12 @@

Clone

-Number RSCG: 3 +Number RSCG: 4 1 [CopyTo](/docs/CopyTo) [![Nuget](https://img.shields.io/nuget/dt/RhoMicro.CodeAnalysis.CopyToGenerator?label=RhoMicro.CodeAnalysis.CopyToGenerator)](https://www.nuget.org/packages/RhoMicro.CodeAnalysis.CopyToGenerator) ![GitHub Repo stars](https://img.shields.io/github/stars/PaulBraetz/RhoMicro.CodeAnalysis?style=social) 2024-02-19 2 [Dolly](/docs/Dolly) [![Nuget](https://img.shields.io/nuget/dt/Dolly?label=Dolly)](https://www.nuget.org/packages/Dolly/) ![GitHub Repo stars](https://img.shields.io/github/stars/AnderssonPeter/Dolly?style=social) 2024-12-03 - 3 [UtilityVerse.Copy](/docs/UtilityVerse.Copy) [![Nuget](https://img.shields.io/nuget/dt/UtilityVerse.Copy?label=UtilityVerse.Copy)](https://www.nuget.org/packages/UtilityVerse.Copy/) ![GitHub Repo stars](https://img.shields.io/github/stars/purkayasta/TheUtilityVerse?style=social) 2025-08-15 + 3 [FastCloner](/docs/FastCloner) [![Nuget](https://img.shields.io/nuget/dt/FastCloner?label=FastCloner)](https://www.nuget.org/packages/FastCloner/) ![GitHub Repo stars](https://img.shields.io/github/stars/lofcz/FastCloner?style=social) 2026-02-01 + + 4 [UtilityVerse.Copy](/docs/UtilityVerse.Copy) [![Nuget](https://img.shields.io/nuget/dt/UtilityVerse.Copy?label=UtilityVerse.Copy)](https://www.nuget.org/packages/UtilityVerse.Copy/) ![GitHub Repo stars](https://img.shields.io/github/stars/purkayasta/TheUtilityVerse?style=social) 2025-08-15 \ No newline at end of file diff --git a/v2/rscg_examples_site/docs/Categories/_PrimitiveClone.mdx b/v2/rscg_examples_site/docs/Categories/_PrimitiveClone.mdx index 4268b9037..36544b270 100644 --- a/v2/rscg_examples_site/docs/Categories/_PrimitiveClone.mdx +++ b/v2/rscg_examples_site/docs/Categories/_PrimitiveClone.mdx @@ -4,7 +4,9 @@ 2 [Dolly](/docs/Dolly) [![Nuget](https://img.shields.io/nuget/dt/Dolly?label=Dolly)](https://www.nuget.org/packages/Dolly/) ![GitHub Repo stars](https://img.shields.io/github/stars/AnderssonPeter/Dolly?style=social) 2024-12-03 - 3 [UtilityVerse.Copy](/docs/UtilityVerse.Copy) [![Nuget](https://img.shields.io/nuget/dt/UtilityVerse.Copy?label=UtilityVerse.Copy)](https://www.nuget.org/packages/UtilityVerse.Copy/) ![GitHub Repo stars](https://img.shields.io/github/stars/purkayasta/TheUtilityVerse?style=social) 2025-08-15 + 3 [FastCloner](/docs/FastCloner) [![Nuget](https://img.shields.io/nuget/dt/FastCloner?label=FastCloner)](https://www.nuget.org/packages/FastCloner/) ![GitHub Repo stars](https://img.shields.io/github/stars/lofcz/FastCloner?style=social) 2026-02-01 + + 4 [UtilityVerse.Copy](/docs/UtilityVerse.Copy) [![Nuget](https://img.shields.io/nuget/dt/UtilityVerse.Copy?label=UtilityVerse.Copy)](https://www.nuget.org/packages/UtilityVerse.Copy/) ![GitHub Repo stars](https://img.shields.io/github/stars/purkayasta/TheUtilityVerse?style=social) 2025-08-15 ### See category diff --git a/v2/rscg_examples_site/docs/NoExamples.md b/v2/rscg_examples_site/docs/NoExamples.md index 2b83782b2..5c9a9f2b2 100644 --- a/v2/rscg_examples_site/docs/NoExamples.md +++ b/v2/rscg_examples_site/docs/NoExamples.md @@ -266,519 +266,539 @@ Why I have not put example: issue opened Why I have not put example: too complicated -66)https://github.com/atc-net/atc-source-generators https://github.com/atc-net/atc-source-generators +66)https://github.com/ANcpLua/ErrorOrX https://github.com/ANcpLua/ErrorOrX Why I have not put example: later -67)https://github.com/Atoen/TextLocalizer https://github.com/Atoen/TextLocalizer +67)https://github.com/atc-net/atc-source-generators https://github.com/atc-net/atc-source-generators + +Why I have not put example: later + +68)https://github.com/Atoen/TextLocalizer https://github.com/Atoen/TextLocalizer Why I have not put example: too complicated -68)https://github.com/Aymen83/AspectWeaver https://github.com/Aymen83/AspectWeaver +69)https://github.com/Aymen83/AspectWeaver https://github.com/Aymen83/AspectWeaver Why I have not put example: later -69)https://github.com/bjornhellander/TestInheritanceGenerator https://github.com/bjornhellander/TestInheritanceGenerator +70)https://github.com/bjornhellander/TestInheritanceGenerator https://github.com/bjornhellander/TestInheritanceGenerator Why I have not put example: too complicated -70)https://github.com/borisdj/CsCodeGenerator https://github.com/borisdj/CsCodeGenerator +71)https://github.com/borisdj/CsCodeGenerator https://github.com/borisdj/CsCodeGenerator Why I have not put example: later -71)https://github.com/buchmiet/FastFsm https://github.com/buchmiet/FastFsm +72)https://github.com/buchmiet/FastFsm https://github.com/buchmiet/FastFsm Why I have not put example: later -72)https://github.com/chickensoft-games/LogicBlocks https://github.com/chickensoft-games/LogicBlocks +73)https://github.com/chickensoft-games/LogicBlocks https://github.com/chickensoft-games/LogicBlocks Why I have not put example: later -73)https://github.com/dgmjr-io/InterfaceGenerator https://github.com/dgmjr-io/InterfaceGenerator +74)https://github.com/dgmjr-io/InterfaceGenerator https://github.com/dgmjr-io/InterfaceGenerator Why I have not put example: issue opened -74)https://github.com/eddievelasquez/IntercodeToolbox https://github.com/eddievelasquez/IntercodeToolbox +75)https://github.com/eddievelasquez/IntercodeToolbox https://github.com/eddievelasquez/IntercodeToolbox Why I have not put example: too complicated -75)https://github.com/FoundatioFx/Foundatio.Mediator https://github.com/FoundatioFx/Foundatio.Mediator +76)https://github.com/FoundatioFx/Foundatio.Mediator https://github.com/FoundatioFx/Foundatio.Mediator Why I have not put example: later -76)https://github.com/GaoNian-NET/MapperToolkit https://github.com/GaoNian-NET/MapperToolkit +77)https://github.com/GaoNian-NET/MapperToolkit https://github.com/GaoNian-NET/MapperToolkit Why I have not put example: issue opened -77)https://github.com/IeuanWalker/MinimalApi.Endpoints/ https://github.com/IeuanWalker/MinimalApi.Endpoints/ +78)https://github.com/IeuanWalker/MinimalApi.Endpoints/ https://github.com/IeuanWalker/MinimalApi.Endpoints/ Why I have not put example: later -78)https://github.com/inputfalken/Dynatello https://github.com/inputfalken/Dynatello +79)https://github.com/inputfalken/Dynatello https://github.com/inputfalken/Dynatello Why I have not put example: too complicated -79)https://github.com/ionite34/MinimalApiMapper https://github.com/ionite34/MinimalApiMapper +80)https://github.com/ionite34/MinimalApiMapper https://github.com/ionite34/MinimalApiMapper Why I have not put example: own idea where to generate files, so overwrites -80)https://github.com/JasonBock/CslaGeneratorSerialization https://github.com/JasonBock/CslaGeneratorSerialization +81)https://github.com/JasonBock/CslaGeneratorSerialization https://github.com/JasonBock/CslaGeneratorSerialization Why I have not put example: too complicated -81)https://github.com/MoslemBenDhaou/DataSurface https://github.com/MoslemBenDhaou/DataSurface +82)https://github.com/MoslemBenDhaou/DataSurface https://github.com/MoslemBenDhaou/DataSurface + +Why I have not put example: later + +83)https://github.com/mu-dawood/EasyValidate https://github.com/mu-dawood/EasyValidate Why I have not put example: later -82)https://github.com/nevsnirG/MinimalRichDomain https://github.com/nevsnirG/MinimalRichDomain +84)https://github.com/nevsnirG/MinimalRichDomain https://github.com/nevsnirG/MinimalRichDomain Why I have not put example: old ISourceGenerator -83)https://github.com/OrgEleCho/EleCho.Internationalization https://github.com/OrgEleCho/EleCho.Internationalization +85)https://github.com/nuskey8/Csv-CSharp https://github.com/nuskey8/Csv-CSharp + +Why I have not put example: later + +86)https://github.com/OrgEleCho/EleCho.Internationalization https://github.com/OrgEleCho/EleCho.Internationalization Why I have not put example: issue opened -84)https://github.com/pierre3/PlantUmlClassDiagramGenerator https://github.com/pierre3/PlantUmlClassDiagramGenerator +87)https://github.com/pekspro/DataAnnotationValuesExtractor https://github.com/pekspro/DataAnnotationValuesExtractor + +Why I have not put example: later + +88)https://github.com/pierre3/PlantUmlClassDiagramGenerator https://github.com/pierre3/PlantUmlClassDiagramGenerator Why I have not put example: later -85)https://github.com/ramhari-dev/PropGenAoT https://github.com/ramhari-dev/PropGenAoT +89)https://github.com/ramhari-dev/PropGenAoT https://github.com/ramhari-dev/PropGenAoT Why I have not put example: no readme -86)https://github.com/stbychkov/AutoLoggerMessage https://github.com/stbychkov/AutoLoggerMessage +90)https://github.com/sebastienros/comptime https://github.com/sebastienros/comptime + +Why I have not put example: later + +91)https://github.com/stbychkov/AutoLoggerMessage https://github.com/stbychkov/AutoLoggerMessage Why I have not put example: Microsoft have done same feature -87)https://github.com/Stepami/visitor-net https://github.com/Stepami/visitor-net +92)https://github.com/Stepami/visitor-net https://github.com/Stepami/visitor-net Why I have not put example: later -88)https://github.com/svee4/RequiredStaticMembers https://github.com/svee4/RequiredStaticMembers +93)https://github.com/svee4/RequiredStaticMembers https://github.com/svee4/RequiredStaticMembers Why I have not put example: issue opened -89)https://github.com/SzymonHalucha/Minerals.AutoCommands https://github.com/SzymonHalucha/Minerals.AutoCommands +94)https://github.com/SzymonHalucha/Minerals.AutoCommands https://github.com/SzymonHalucha/Minerals.AutoCommands Why I have not put example: later -90)https://github.com/Teleopti/Saspect https://github.com/Teleopti/Saspect +95)https://github.com/Teleopti/Saspect https://github.com/Teleopti/Saspect Why I have not put example: later -91)https://github.com/TheFo2sh/AsyncFlow https://github.com/TheFo2sh/AsyncFlow +96)https://github.com/TheFo2sh/AsyncFlow https://github.com/TheFo2sh/AsyncFlow Why I have not put example: too complicated -92)https://github.com/wieslawsoltes/ReactiveGenerator https://github.com/wieslawsoltes/ReactiveGenerator +97)https://github.com/wieslawsoltes/ReactiveGenerator https://github.com/wieslawsoltes/ReactiveGenerator Why I have not put example: too complicated -93)https://www.nuget.org/packages/Aspid.Generators.Helper https://www.nuget.org/packages/Aspid.Generators.Helper +98)https://www.nuget.org/packages/Aspid.Generators.Helper https://www.nuget.org/packages/Aspid.Generators.Helper Why I have not put example: later -94)https://www.nuget.org/packages/AsyncTaskOrchestratorGenerator https://www.nuget.org/packages/AsyncTaskOrchestratorGenerator +99)https://www.nuget.org/packages/AsyncTaskOrchestratorGenerator https://www.nuget.org/packages/AsyncTaskOrchestratorGenerator Why I have not put example: later -95)https://www.nuget.org/packages/Csla.Generator.AutoImplementProperties.CSharp/ https://www.nuget.org/packages/Csla.Generator.AutoImplementProperties.CSharp/ +100)https://www.nuget.org/packages/Csla.Generator.AutoImplementProperties.CSharp/ https://www.nuget.org/packages/Csla.Generator.AutoImplementProperties.CSharp/ Why I have not put example: later -96)https://www.nuget.org/packages/Csla.Generator.AutoSerialization.CSharp/ https://www.nuget.org/packages/Csla.Generator.AutoSerialization.CSharp/ +101)https://www.nuget.org/packages/Csla.Generator.AutoSerialization.CSharp/ https://www.nuget.org/packages/Csla.Generator.AutoSerialization.CSharp/ Why I have not put example: later -97)https://www.nuget.org/packages/CTMGenerator https://www.nuget.org/packages/CTMGenerator +102)https://www.nuget.org/packages/CTMGenerator https://www.nuget.org/packages/CTMGenerator Why I have not put example: later -98)https://www.nuget.org/packages/DecoWeaver https://www.nuget.org/packages/DecoWeaver +103)https://www.nuget.org/packages/DecoWeaver https://www.nuget.org/packages/DecoWeaver Why I have not put example: later -99)https://www.nuget.org/packages/JsonDerivedTypeGenerator https://www.nuget.org/packages/JsonDerivedTypeGenerator +104)https://www.nuget.org/packages/JsonDerivedTypeGenerator https://www.nuget.org/packages/JsonDerivedTypeGenerator Why I have not put example: later -100)https://www.nuget.org/packages/MappingSourceGenerator https://www.nuget.org/packages/MappingSourceGenerator +105)https://www.nuget.org/packages/MappingSourceGenerator https://www.nuget.org/packages/MappingSourceGenerator Why I have not put example: later -101)https://www.nuget.org/packages/Optikode.FluentMapper https://www.nuget.org/packages/Optikode.FluentMapper +106)https://www.nuget.org/packages/Optikode.FluentMapper https://www.nuget.org/packages/Optikode.FluentMapper Why I have not put example: later -102)https://www.nuget.org/packages/SoapProxyPocoGenerator https://www.nuget.org/packages/SoapProxyPocoGenerator +107)https://www.nuget.org/packages/SoapProxyPocoGenerator https://www.nuget.org/packages/SoapProxyPocoGenerator Why I have not put example: later -103)https://www.nuget.org/packages/TinyMediator https://www.nuget.org/packages/TinyMediator +108)https://www.nuget.org/packages/TinyMediator https://www.nuget.org/packages/TinyMediator Why I have not put example: later -104)https://www.nuget.org/packages/TomRR.SourceGenerator.SettingsBinder https://www.nuget.org/packages/TomRR.SourceGenerator.SettingsBinder +109)https://www.nuget.org/packages/TomRR.SourceGenerator.SettingsBinder https://www.nuget.org/packages/TomRR.SourceGenerator.SettingsBinder Why I have not put example: later -105)https://www.nuget.org/packages/X39.Roslyn.Property https://www.nuget.org/packages/X39.Roslyn.Property +110)https://www.nuget.org/packages/X39.Roslyn.Property https://www.nuget.org/packages/X39.Roslyn.Property Why I have not put example: later -106)https://www.nuget.org/packages/ZeroReflection.Mapper.Generator/ https://www.nuget.org/packages/ZeroReflection.Mapper.Generator/ +111)https://www.nuget.org/packages/ZeroReflection.Mapper.Generator/ https://www.nuget.org/packages/ZeroReflection.Mapper.Generator/ Why I have not put example: later -107)https://www.nuget.org/packages/ZeroReflection.Mediator.Generator https://www.nuget.org/packages/ZeroReflection.Mediator.Generator +112)https://www.nuget.org/packages/ZeroReflection.Mediator.Generator https://www.nuget.org/packages/ZeroReflection.Mediator.Generator Why I have not put example: later -108)HubClientProxyGenerator https://www.nuget.org/packages/Microsoft.AspNetCore.SignalR.Client.SourceGenerator +113)HubClientProxyGenerator https://www.nuget.org/packages/Microsoft.AspNetCore.SignalR.Client.SourceGenerator Why I have not put example: not having nuget, but having IIncrementalGenerator -109)Imp.NET https://github.com/DouglasDwyer/Imp.NET +114)Imp.NET https://github.com/DouglasDwyer/Imp.NET Why I have not put example: old ISourceGenerator -110)Intellenum https://github.com/SteveDunn/Intellenum +115)Intellenum https://github.com/SteveDunn/Intellenum Why I have not put example: not understand how to use -111)InterfaceGenerator https://github.com/daver32/InterfaceGenerator +116)InterfaceGenerator https://github.com/daver32/InterfaceGenerator Why I have not put example: old ISourceGenerator -112)IoTHubClientGenerator https://github.com/alonf/IoTHubClientGenerator +117)IoTHubClientGenerator https://github.com/alonf/IoTHubClientGenerator Why I have not put example: old ISourceGenerator -113)JsonByExampleGenerator https://github.com/hermanussen/JsonByExampleGenerator +118)JsonByExampleGenerator https://github.com/hermanussen/JsonByExampleGenerator Why I have not put example: old ISourceGenerator -114)JsonDeserializeResourceSourceGenerator https://github.com/musictopia2/JsonDeserializeResourceSourceGenerator +119)JsonDeserializeResourceSourceGenerator https://github.com/musictopia2/JsonDeserializeResourceSourceGenerator Why I have not put example: no readme -115)JsonMergePatch https://github.com/ladeak/JsonMergePatch +120)JsonMergePatch https://github.com/ladeak/JsonMergePatch Why I have not put example: old ISourceGenerator -116)JsonSerializerContextGenerator https://github.com/musictopia2/JsonSerializerContextGenerator +121)JsonSerializerContextGenerator https://github.com/musictopia2/JsonSerializerContextGenerator Why I have not put example: no readme -117)JsonSourceGenerator https://github.com/Pilchie/JsonSourceGenerator +122)JsonSourceGenerator https://github.com/Pilchie/JsonSourceGenerator Why I have not put example: not having nuget, but having IIncrementalGenerator -118)JsonSrcGen https://github.com/trampster/JsonSrcGen +123)JsonSrcGen https://github.com/trampster/JsonSrcGen Why I have not put example: old ISourceGenerator -119)kli.Localize https://github.com/kl1mm/localize +124)kli.Localize https://github.com/kl1mm/localize Why I have not put example: old ISourceGenerator -120)laker https://github.com/Lakerfield/Lakerfield.Rpc +125)laker https://github.com/Lakerfield/Lakerfield.Rpc Why I have not put example: too complicated -121)lambdajection https://github.com/cythral/lambdajection +126)lambdajection https://github.com/cythral/lambdajection Why I have not put example: old ISourceGenerator -122)Lazysh https://github.com/B1Z0N/LazyshGen +127)Lazysh https://github.com/B1Z0N/LazyshGen Why I have not put example: old ISourceGenerator -123)LoggingDecoratorGenerator https://github.com/DavidFineboym/LoggingDecoratorGenerator +128)LoggingDecoratorGenerator https://github.com/DavidFineboym/LoggingDecoratorGenerator Why I have not put example: Microsoft have done same feature -124)lucide-blazor https://github.com/brecht-vde/lucide-blazor/ +129)lucide-blazor https://github.com/brecht-vde/lucide-blazor/ Why I have not put example: issue opened -125)ManagedDotnetProfiler https://github.com/kevingosse/ManagedDotnetProfiler +130)ManagedDotnetProfiler https://github.com/kevingosse/ManagedDotnetProfiler Why I have not put example: too complicated -126)MapDataReader https://github.com/jitbit/MapDataReader +131)MapDataReader https://github.com/jitbit/MapDataReader Why I have not put example: old ISourceGenerator -127)MappingCloningExtensions https://github.com/musictopia2/MappingCloningExtensions +132)MappingCloningExtensions https://github.com/musictopia2/MappingCloningExtensions Why I have not put example: no readme -128)Maui.BindableProperty.Generator https://github.com/rrmanzano/maui-bindableproperty-generator +133)Maui.BindableProperty.Generator https://github.com/rrmanzano/maui-bindableproperty-generator Why I have not put example: later -129)MediatR https://github.com/Burgyn/MMLib.MediatR.Generators +134)MediatR https://github.com/Burgyn/MMLib.MediatR.Generators Why I have not put example: old ISourceGenerator -130)MemberAccessGenerator https://github.com/ufcpp/MemberAccessGenerator +135)MemberAccessGenerator https://github.com/ufcpp/MemberAccessGenerator Why I have not put example: old ISourceGenerator -131)MemoizeSourceGenerator https://github.com/Zoxive/MemoizeSourceGenerator +136)MemoizeSourceGenerator https://github.com/Zoxive/MemoizeSourceGenerator Why I have not put example: old ISourceGenerator -132)Minerals.AutoCQRS https://github.com/SzymonHalucha/Minerals.AutoCQRS +137)Minerals.AutoCQRS https://github.com/SzymonHalucha/Minerals.AutoCQRS Why I have not put example: later -133)Minerals.AutoDomain https://github.com/SzymonHalucha/Minerals.AutoDomain +138)Minerals.AutoDomain https://github.com/SzymonHalucha/Minerals.AutoDomain Why I have not put example: later -134)MiniRazor https://github.com/Tyrrrz/MiniRazor/ +139)MiniRazor https://github.com/Tyrrrz/MiniRazor/ Why I have not put example: archived -135)MockableStaticGenerator https://github.com/HamedFathi/MockableStaticGenerator +140)MockableStaticGenerator https://github.com/HamedFathi/MockableStaticGenerator Why I have not put example: old ISourceGenerator -136)MockGen https://github.com/thomas-girotto/MockGen +141)MockGen https://github.com/thomas-girotto/MockGen Why I have not put example: old ISourceGenerator -137)MockSourceGenerator https://github.com/hermanussen/MockSourceGenerator +142)MockSourceGenerator https://github.com/hermanussen/MockSourceGenerator Why I have not put example: old ISourceGenerator -138)MrMeeseeks.DIE https://github.com/Yeah69/MrMeeseeks.DIE +143)MrMeeseeks.DIE https://github.com/Yeah69/MrMeeseeks.DIE Why I have not put example: old ISourceGenerator -139)MrMeeseeks.ResXToViewModelGenerator https://github.com/Yeah69/MrMeeseeks.ResXToViewModelGenerator +144)MrMeeseeks.ResXToViewModelGenerator https://github.com/Yeah69/MrMeeseeks.ResXToViewModelGenerator Why I have not put example: old ISourceGenerator -140)MrMeeseeks.StaticDelegateGenerator https://github.com/Yeah69/MrMeeseeks.StaticDelegateGenerator +145)MrMeeseeks.StaticDelegateGenerator https://github.com/Yeah69/MrMeeseeks.StaticDelegateGenerator Why I have not put example: old ISourceGenerator -141)MrMeeseeks.Visitor https://github.com/Yeah69/MrMeeseeks.Visitor +146)MrMeeseeks.Visitor https://github.com/Yeah69/MrMeeseeks.Visitor Why I have not put example: old ISourceGenerator -142)Neon.Roslyn https://www.nuget.org/packages/Neon.Roslyn +147)Neon.Roslyn https://www.nuget.org/packages/Neon.Roslyn Why I have not put example: old ISourceGenerator -143)net_automatic_interface https://github.com/codecentric/net_automatic_interface +148)net_automatic_interface https://github.com/codecentric/net_automatic_interface Why I have not put example: old ISourceGenerator -144)NSourceGenerators https://github.com/NeVeSpl/NSourceGenerators/ +149)NSourceGenerators https://github.com/NeVeSpl/NSourceGenerators/ Why I have not put example: old ISourceGenerator -145)observable https://github.com/notanaverageman/Bindables +150)observable https://github.com/notanaverageman/Bindables Why I have not put example: later -146)Pipelines https://github.com/DumplingsDevs/Pipelines/ +151)Pipelines https://github.com/DumplingsDevs/Pipelines/ Why I have not put example: old ISourceGenerator -147)Plastic https://github.com/sang-hyeon/Plastic +152)Plastic https://github.com/sang-hyeon/Plastic Why I have not put example: old ISourceGenerator -148)PolySharp https://github.com/Sergio0694/PolySharp +153)PolySharp https://github.com/Sergio0694/PolySharp Why I have not put example: too complicated -149)PrimaryConstructor https://github.com/chaowlert/PrimaryConstructor +154)PrimaryConstructor https://github.com/chaowlert/PrimaryConstructor Why I have not put example: old ISourceGenerator -150)PrimitiveStaticDataGenerator https://github.com/iiweis/PrimitiveStaticDataGenerator +155)PrimitiveStaticDataGenerator https://github.com/iiweis/PrimitiveStaticDataGenerator Why I have not put example: old ISourceGenerator -151)PrintMembersGenerator https://github.com/Youssef1313/PrintMembersGenerator +156)PrintMembersGenerator https://github.com/Youssef1313/PrintMembersGenerator Why I have not put example: old ISourceGenerator -152)ProxyInterfaceGenerator https://github.com/StefH/ProxyInterfaceSourceGenerator +157)ProxyInterfaceGenerator https://github.com/StefH/ProxyInterfaceSourceGenerator Why I have not put example: old ISourceGenerator -153)PureHDF https://github.com/Apollo3zehn/PureHDF +158)PureHDF https://github.com/Apollo3zehn/PureHDF Why I have not put example: old ISourceGenerator -154)RazorGen https://github.com/dartk/RazorGen +159)RazorGen https://github.com/dartk/RazorGen Why I have not put example: later -155)RazorPageRouteGenerator https://github.com/surgicalcoder/RazorPageRouteGenerator +160)RazorPageRouteGenerator https://github.com/surgicalcoder/RazorPageRouteGenerator Why I have not put example: old ISourceGenerator -156)ReForge.Union https://github.com/nalcorso/ReForge.Union +161)ReForge.Union https://github.com/nalcorso/ReForge.Union Why I have not put example: not having nuget, but having IIncrementalGenerator -157)RoslynWeave https://github.com/Jishun/RoslynWeave +162)RoslynWeave https://github.com/Jishun/RoslynWeave Why I have not put example: old ISourceGenerator -158)ScenarioTests https://github.com/koenbeuk/ScenarioTests +163)ScenarioTests https://github.com/koenbeuk/ScenarioTests Why I have not put example: old ISourceGenerator -159)SerdeDn https://github.com/serdedotnet/serde +164)SerdeDn https://github.com/serdedotnet/serde Why I have not put example: serializer. Done by MSFT with System.Text.Json -160)SmallSharp https://github.com/devlooped/SmallSharp +165)SmallSharp https://github.com/devlooped/SmallSharp Why I have not put example: old ISourceGenerator -161)SmartAnnotations https://github.com/fiseni/SmartAnnotations +166)SmartAnnotations https://github.com/fiseni/SmartAnnotations Why I have not put example: old ISourceGenerator -162)SogePoco https://github.com/d-p-y/SogePoco +167)SogePoco https://github.com/d-p-y/SogePoco Why I have not put example: too complicated -163)SourceApi https://github.com/alekshura/SourceApi +168)SourceApi https://github.com/alekshura/SourceApi Why I have not put example: old ISourceGenerator -164)SourceConfig https://github.com/alekshura/SourceConfig +169)SourceConfig https://github.com/alekshura/SourceConfig Why I have not put example: old ISourceGenerator -165)SourceCrafter.HttpServiceClientGenerator https://github.com/pedro-gilmora/SourceCrafter.HttpServiceClientGenerator/ +170)SourceCrafter.HttpServiceClientGenerator https://github.com/pedro-gilmora/SourceCrafter.HttpServiceClientGenerator/ Why I have not put example: later -166)SourceGeneratorQuery https://github.com/roeibajayo/SourceGeneratorQuery +171)SourceGeneratorQuery https://github.com/roeibajayo/SourceGeneratorQuery Why I have not put example: old ISourceGenerator -167)SourceInject https://github.com/giggio/sourceinject/ +172)SourceInject https://github.com/giggio/sourceinject/ Why I have not put example: old ISourceGenerator -168)SourceMapper https://github.com/alekshura/SourceMapper +173)SourceMapper https://github.com/alekshura/SourceMapper Why I have not put example: old ISourceGenerator -169)SourceMapper https://github.com/paiden/SourceMapper/ +174)SourceMapper https://github.com/paiden/SourceMapper/ Why I have not put example: old ISourceGenerator -170)SqlMarshal https://github.com/kant2002/SqlMarshal +175)SqlMarshal https://github.com/kant2002/SqlMarshal Why I have not put example: old ISourceGenerator -171)ST.NSwag.ServerSourceGenerator https://github.com/s-tarasov/ST.NSwag.ServerSourceGenerator +176)ST.NSwag.ServerSourceGenerator https://github.com/s-tarasov/ST.NSwag.ServerSourceGenerator Why I have not put example: later -172)StackXML https://github.com/ZingBallyhoo/StackXML +177)StackXML https://github.com/ZingBallyhoo/StackXML Why I have not put example: old ISourceGenerator -173)StaticProxyGenerator https://github.com/robertturner/StaticProxyGenerator +178)StaticProxyGenerator https://github.com/robertturner/StaticProxyGenerator Why I have not put example: old ISourceGenerator -174)StrongInject https://github.com/YairHalberstadt/stronginject/ +179)StrongInject https://github.com/YairHalberstadt/stronginject/ Why I have not put example: later -175)StronglyTypedEmbeddedResources https://github.com/surgicalcoder/StronglyTypedEmbeddedResources +180)StronglyTypedEmbeddedResources https://github.com/surgicalcoder/StronglyTypedEmbeddedResources Why I have not put example: old ISourceGenerator -176)StructPacker https://github.com/RudolfKurka/StructPacker +181)StructPacker https://github.com/RudolfKurka/StructPacker Why I have not put example: old ISourceGenerator -177)Svg https://github.com/wieslawsoltes/Svg.Skia +182)Svg https://github.com/wieslawsoltes/Svg.Skia Why I have not put example: old ISourceGenerator -178)tecli https://github.com/tyevco/TeCLI +183)tecli https://github.com/tyevco/TeCLI Why I have not put example: old ISourceGenerator -179)TeuJson https://github.com/Terria-K/TeuJson +184)TeuJson https://github.com/Terria-K/TeuJson Why I have not put example: json a class, was done in System.Text.Json -180)Thunderboltloc https://github.com/AlyElhaddad/ThunderboltIoc +185)Thunderboltloc https://github.com/AlyElhaddad/ThunderboltIoc Why I have not put example: old ISourceGenerator -181)Tinyhand https://github.com/archi-Doc/Tinyhand +186)Tinyhand https://github.com/archi-Doc/Tinyhand Why I have not put example: tried, need documentation -182)ToString https://github.com/Burgyn/MMLib.ToString +187)ToString https://github.com/Burgyn/MMLib.ToString Why I have not put example: old ISourceGenerator -183)Transplator https://github.com/atifaziz/Transplator +188)Transplator https://github.com/atifaziz/Transplator Why I have not put example: old ISourceGenerator -184)TupleOverloadGenerator https://github.com/ProphetLamb/TupleOverloadGenerator +189)TupleOverloadGenerator https://github.com/ProphetLamb/TupleOverloadGenerator Why I have not put example: too complicated -185)TxtToListGenerator https://github.com/musictopia2/TxtToListGenerator +190)TxtToListGenerator https://github.com/musictopia2/TxtToListGenerator Why I have not put example: no readme -186)TypealizR https://github.com/earloc/TypealizR +191)TypealizR https://github.com/earloc/TypealizR Why I have not put example: depends on Microsoft.Extensions.Localization -187)UnitTestBlazor https://github.com/bUnit-dev/bUnit +192)UnitTestBlazor https://github.com/bUnit-dev/bUnit Why I have not put example: issue opened -188)ValueChangedGenerator https://github.com/ufcpp/ValueChangedGenerator +193)ValueChangedGenerator https://github.com/ufcpp/ValueChangedGenerator Why I have not put example: old ISourceGenerator -189)ValueLink https://github.com/archi-Doc/ValueLink +194)ValueLink https://github.com/archi-Doc/ValueLink Why I have not put example: too complicated -190)ValueObjectGenerator https://github.com/RyotaMurohoshi/ValueObjectGenerator +195)ValueObjectGenerator https://github.com/RyotaMurohoshi/ValueObjectGenerator Why I have not put example: old ISourceGenerator -191)VisitorPatternGenerator https://github.com/hikarin522/VisitorPatternGenerator/ +196)VisitorPatternGenerator https://github.com/hikarin522/VisitorPatternGenerator/ Why I have not put example: issue opened -192)Visor https://github.com/Tinkoff/Visor +197)Visor https://github.com/Tinkoff/Visor Why I have not put example: archived -193)WrapperValueObject https://github.com/martinothamar/WrapperValueObject +198)WrapperValueObject https://github.com/martinothamar/WrapperValueObject Why I have not put example: not maintained as in readme -194)Xtz.StronglyTyped https://github.com/dev-experience/Xtz.StronglyTyped +199)Xtz.StronglyTyped https://github.com/dev-experience/Xtz.StronglyTyped Why I have not put example: old ISourceGenerator diff --git a/v2/rscg_examples_site/docs/RSCG-Examples/FastCloner.md b/v2/rscg_examples_site/docs/RSCG-Examples/FastCloner.md new file mode 100644 index 000000000..768a1533a --- /dev/null +++ b/v2/rscg_examples_site/docs/RSCG-Examples/FastCloner.md @@ -0,0 +1,692 @@ +--- +sidebar_position: 2530 +title: 253 - FastCloner +description: Cloning objects +slug: /FastCloner +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import TOCInline from '@theme/TOCInline'; +import SameCategory from '../Categories/_PrimitiveClone.mdx'; + +# FastCloner by Matěj Štágl + + + + +## NuGet / site data +[![Nuget](https://img.shields.io/nuget/dt/FastCloner?label=FastCloner)](https://www.nuget.org/packages/FastCloner/) +[![GitHub last commit](https://img.shields.io/github/last-commit/lofcz/FastCloner?label=updated)](https://github.com/lofcz/FastCloner/) +![GitHub Repo stars](https://img.shields.io/github/stars/lofcz/FastCloner?style=social) + +## Details + +### Info +:::info + +Name: **FastCloner** + +Fast deep cloning library for .NET 8+. Supports both deep and shallow cloning. Extensively tested, focused on performance and stability even on complicated object graphs. + +Author: Matěj Štágl + +NuGet: +*https://www.nuget.org/packages/FastCloner/* + + +You can find more details at https://github.com/lofcz/FastCloner/ + +Source: https://github.com/lofcz/FastCloner/ + +::: + +### Author +:::note +Matěj Štágl +![Alt text](https://github.com/lofcz.png) +::: + +### Original Readme +:::note + +
+ +FastCloner + +# FastCloner + +**The fastest and most reliable .NET deep cloning library.** + +[![FastCloner](https://shields.io/nuget/v/FastCloner?v=304&icon=nuget&label=FastCloner)](https://www.nuget.org/packages/FastCloner) +[![FastCloner](https://shields.io/nuget/v/FastCloner.SourceGenerator?v=304&icon=nuget&label=FastCloner.SourceGenerator)](https://www.nuget.org/packages/FastCloner.SourceGenerator) +[![License:MIT](https://img.shields.io/badge/License-MIT-34D058.svg)](https://opensource.org/license/mit) + +The fastest deep cloning library, supporting anything from .NET 4.6 to modern .NET 10+ with no dependencies. FastCloner uses a unique source generator capable of analyzing object graphs and cloning objects without explicit annotations. For types that cannot be cloned, such as HttpClient, FastCloner uses a highly optimized reflection-based fallback. Zero dependencies, blazingly fast, built for developers who need cloning that _just works_. + +
+ +## ✨ Features + +- **The Fastest** - [Benchmarked](https://github.com/lofcz/FastCloner?tab=readme-ov-file#performance) to beat all other libraries with third-party independent benchmarks verifying the performance. **300x** speed-up vs `Newtonsoft.Json` and **160x** vs `System.Text.Json` +- **The Most Correct** - Cloning objects is hard: ``, `abstract`, immutables, read-only, pointers, circular dependencies, deeply nested graphs.. we have over [700 tests](https://github.com/lofcz/FastCloner/tree/next/FastCloner.Tests) verifying correct behavior in these cases and we are transparent about the [limitations](https://github.com/lofcz/FastCloner?tab=readme-ov-file#limitations) +- **Novel Algorithm** - FastCloner recognizes that certain cloning code cannot be generated in certain scenarios and uses highly optimized reflection-based approach instead for these types - this only happens for the members that need this, not entire objects +- **Zero-Overhead Abstractions** - The generator uses call site analysis to eliminate indirection via inlining of generated methods. This ensures the generated code behaves like a single optimized block, just as if you hand-wrote it for maximum performance. +- **Embeddable** - FastCloner has no dependencies outside the standard library. Source generator and reflection parts can be installed independently +- **Gentle & Caring** - FastCloner detects standard attributes like `[NonSerialized]` making it easy to try without polluting codebase with custom attributes. Type usage graph for generics is built automatically producing performant cloning code without manual annotations +- **Easy Integration** - `FastDeepClone()` for AOT cloning, `DeepClone()` for reflection cloning. That's it! +- **Production Ready** - Used by projects like [Jobbr](https://jobbr.readthedocs.io/en/latest), [TarkovSP](https://sp-tarkov.com), and [WinPaletter](https://github.com/Abdelrhman-AK/WinPaletter), with over [200K downloads on NuGet](https://www.nuget.org/packages/fastCloner#usedby-body-tab) +## Getting Started + +Install the package via NuGet: + +```powershell +dotnet add package FastCloner # Reflection +dotnet add package FastCloner.SourceGenerator # AOT +``` + +### Clone via Reflection + +```csharp +using FastCloner.Code; +var clone = FastCloner.FastCloner.DeepClone(new \{ Hello = "world", MyList = new List \{ 1 \} }); +``` + +For convenience, add the following method to your project. We intentionally don't ship this extension to make switching from/to FastCloner easier: + +```cs +[return: NotNullIfNotNull(nameof(obj))] +public static T? DeepClone(this T? obj) +{ + return FastCloner.FastCloner.DeepClone(obj); +} +``` + +### Clone via Source Generator + +```cs +[FastClonerClonable] +public class GenericClass +{ + public T Value \{ get; set; } +} + +public class MyClass +{ + public string StrVal \{ get; set; } +} + +// [FastClonerClonable] is only required on types where you call .FastDeepClone() +var original = new GenericClass> \{ Value = new List \{ new MyClass \{ StrVal = "hello world" \} } }; +var clone = original.FastDeepClone(); +``` + +## Advanced Usage + +### Customizing Clone Behavior + +FastCloner supports behavior attributes that control how types and members are cloned: + +| Behavior | Effect | +|----------|--------| +| `Clone` | Deep recursive copy | +| `Reference` | Return original instance unchanged | +| `Shallow` | `MemberwiseClone` without recursion | +| `Ignore` | Return `default` | + +#### Compile-time (Attributes) + +Apply attributes to **types** or **members**. Member-level attributes override type-level: + +```csharp +[FastClonerReference] // Type-level: all usages preserve reference +public class SharedService \{ } + +public class MyClass +{ + public SharedService Svc \{ get; set; \} // Uses type-level → Reference + + [FastClonerBehavior(CloneBehavior.Clone)] // Member-level override → Clone + public SharedService ClonedSvc \{ get; set; } + + [FastClonerIgnore] // → null/default + public CancellationToken Token \{ get; set; } + + [FastClonerShallow] // → Reference copied directly + public ParentNode Parent \{ get; set; } +} +``` + +Shorthand attributes: `[FastClonerIgnore]`, `[FastClonerShallow]`, `[FastClonerReference]` +Explicit: `[FastClonerBehavior(CloneBehavior.X)]` + +#### Runtime (Reflection only) + +Configure type behavior dynamically. Runtime settings are checked **before** attributes: + +```csharp +FastCloner.FastCloner.SetTypeBehavior(CloneBehavior.Reference); +FastCloner.FastCloner.ClearTypeBehavior(); // Reset one +FastCloner.FastCloner.ClearAllTypeBehaviors(); // Reset all +``` + +> **Note**: Changing runtime behavior invalidates the cache. Try to configure once at startup, or use compile-time attributes when possible. + +#### Precedence (highest to lowest) + +1. Runtime `SetTypeBehavior()` +2. Member-level attribute +3. Type-level attribute on member's type +4. Default behavior + +### Cache Management + +```csharp +FastCloner.FastCloner.ClearCache(); // Free memory from reflection cache +``` + + +### Generic Classes and Abstract Types + +The source generator automatically discovers which concrete types your generic classes and abstract hierarchies are used with: + +**Generic types** - The generator scans your codebase for usages like `MyClass` or `MyClass` and generates specialized cloning code: + +```cs +[FastClonerClonable] +public class Container +{ + public T Value \{ get; set; } +} + +// Source generator finds this usage and generates cloning code for Container +var container = new Container \{ Value = 42 }; +var clone = container.FastDeepClone(); +``` + +**Abstract classes** - The generator automatically finds all concrete derived types in your codebase: + +```cs +[FastClonerClonable] +public abstract class Animal +{ + public string Name \{ get; set; } +} + +public class Dog : Animal +{ + public string Breed \{ get; set; } +} + +public class Cat : Animal +{ + public bool IsIndoor \{ get; set; } +} + +// Cloning via the abstract type works - the generator discovered Dog and Cat +Animal pet = new Dog \{ Name = "Buddy", Breed = "Labrador" }; +Animal clone = pet.FastDeepClone(); // Returns a cloned Dog +``` + +### Explicitly Including Types + +When a type is only used dynamically (not visible at compile time), use `[FastClonerInclude]` to ensure the generator creates cloning code for it: + +```cs +[FastClonerClonable] +[FastClonerInclude(typeof(Customer), typeof(Order))] // Include types used dynamically +public class Wrapper +{ + public T Value \{ get; set; } +} +``` + +For abstract classes, you can also use `[FastClonerInclude]` to add derived types that aren't in your codebase (e.g., from external assemblies): + +```cs +[FastClonerClonable] +[FastClonerInclude(typeof(ExternalPlugin))] // Add external derived types +public abstract class Plugin +{ + public string Name \{ get; set; } +} +``` + +### Custom Cloning Context + +For advanced scenarios, create a custom cloning context to explicitly register types you want to clone. This is useful when you need a centralized cloning entry point or want to clone types from external assemblies: + +```cs +public class Customer +{ + public string Name \{ get; set; } + public Address Address \{ get; set; } +} + +public class Address +{ + public string City \{ get; set; } +} + +// Create a context and register types to clone +[FastClonerRegister(typeof(Customer), typeof(Address))] +public partial class MyCloningContext : FastClonerContext \{ } +``` + +Using the context: +```cs +MyCloningContext ctx = new MyCloningContext(); + +// Clone with compile-time type safety +Customer clone = ctx.Clone(original); + +// Check if a type is handled by this context +bool handled = ctx.IsHandled(typeof(Customer)); // true + +// Try to clone (returns false for unregistered types) +if (ctx.TryClone(obj, out var cloned)) +{ + // Successfully cloned +} +``` + +### Nullability Trust + +The generator can be instructed to fully trust nullability annotations. When `[FastClonerTrustNullability]` attribute is applied, FastCloner will skip null checks for non-nullable reference types (e.g., `string` vs `string?`), assuming the contract is valid. + +```csharp +[FastClonerClonable] +[FastClonerTrustNullability] // Skip null checks for non-nullable members +public class HighPerformanceDto +{ + public string Id \{ get; set; \} // No null check generated + public string? Details \{ get; set; \} // Null check still generated +} +``` + +This eliminates branching and improves performance slightly. If a non-nullable property is actually null at runtime, this may result in a `NullReferenceException` in the generated code. + +### Safe Handles + +When you have a struct that acts as a handle to internal state or a singleton (where identity matters), use `[FastClonerSafeHandle]`. This tells FastCloner to shallow-copy the readonly fields instead of deep-cloning them, preserving the original internal references. + +```csharp +[FastClonerSafeHandle] +public struct MyHandle +{ + private readonly object _internalState; // Preserved (shared), not deep cloned + public int Value; // Cloned normally +} +``` + +This is the default behavior for system types like `System.Net.Http.Headers.HeaderDescriptor` to prevent breaking internal framework logic. Use this attribute if your custom structs behave similarly. + +### Identity Preservation + +By default, FastCloner prioritizes performance by not tracking object identity during cloning. This means if the same object instance appears multiple times in your graph, each reference becomes a separate clone. + +For scenarios where you need to preserve object identity (e.g., shared references should remain shared in the clone), use `[FastClonerPreserveIdentity]`: + +```csharp +[FastClonerClonable] +[FastClonerPreserveIdentity] // Enable identity tracking for this type +public class Document +{ + public User Author \{ get; set; } + public User LastEditor \{ get; set; \} // May reference the same User as Author +} + +var doc = new Document \{ Author = user, LastEditor = user }; +var clone = doc.FastDeepClone(); +// clone.Author == clone.LastEditor (same cloned instance) +``` + +The attribute can be applied at type level or member level: + +```csharp +[FastClonerClonable] +public class Container +{ + // Only this member tracks identity + [FastClonerPreserveIdentity] + public List Nodes \{ get; set; } + + // This member clones without identity tracking (faster) + public List Items \{ get; set; } +} +``` + +You can also explicitly disable identity preservation for a member when the type has it enabled: + +```csharp +[FastClonerClonable] +[FastClonerPreserveIdentity] +public class Graph +{ + public Node Root \{ get; set; } + + [FastClonerPreserveIdentity(false)] // Opt out for this member + public List Labels \{ get; set; } +} +``` + +> **Note**: Identity preservation adds overhead for tracking seen objects. Circular references are always detected regardless of this setting. + +## Limitations + +- Cloning unmanaged resources, such as `IntPtr`s may result in side-effects, as there is no metadata for the length of buffers such pointers often point to. +- `ReadOnly` and `Immutable` collections are tested to behave well if they follow basic conventions. +- With reflection, cloning deeply nested objects switches from recursion to iterative approach on the fly. The threshold for this can be configured by changing `FastCloner.MaxRecursionDepth`, iterative approach is marginally slower. + +## Performance + +FastCloner is the _fastest_ deep cloning library. It was benchmarked against every library capable of cloning objects I've been able to find: +```md +BenchmarkDotNet v0.15.8, Windows 11 (10.0.26220.7271) +Intel Core i7-8700 CPU 3.20GHz (Max: 3.19GHz) (Coffee Lake), 1 CPU, 12 logical and 6 physical cores +.NET SDK 10.0.100 + +| Method | Mean | Error | StdDev | Median | Ratio | RatioSD | Rank | Gen0 | Gen1 | Allocated | Alloc Ratio | +|------------------- |------------:|-----------:|-----------:|------------:|-------:|--------:|-----:|-------:|-------:|----------:|------------:| +| FastCloner | 10.25 ns | 0.219 ns | 0.183 ns | 10.24 ns | 1.00 | 0.02 | 1 | 0.0115 | - | 72 B | 1.00 | +| DeepCopier | 23.37 ns | 0.448 ns | 0.582 ns | 23.29 ns | 2.28 | 0.07 | 2 | 0.0115 | - | 72 B | 1.00 | +| DeepCopy | 40.56 ns | 3.589 ns | 10.583 ns | 43.56 ns | 3.96 | 1.03 | 3 | 0.0115 | - | 72 B | 1.00 | +| DeepCopyExpression | 126.05 ns | 3.355 ns | 9.892 ns | 129.32 ns | 12.30 | 0.98 | 4 | 0.0356 | - | 224 B | 3.11 | +| AutoMapper | 135.07 ns | 6.097 ns | 17.976 ns | 143.16 ns | 13.18 | 1.76 | 5 | 0.0114 | - | 72 B | 1.00 | +| DeepCloner | 261.42 ns | 14.113 ns | 41.614 ns | 282.99 ns | 25.51 | 4.06 | 6 | 0.0367 | - | 232 B | 3.22 | +| ObjectCloner | 336.89 ns | 14.249 ns | 42.012 ns | 355.28 ns | 32.87 | 4.12 | 7 | 0.0534 | - | 336 B | 4.67 | +| MessagePack | 499.71 ns | 20.831 ns | 61.420 ns | 524.63 ns | 48.75 | 6.02 | 8 | 0.0315 | - | 200 B | 2.78 | +| ProtobufNet | 898.60 ns | 34.925 ns | 102.978 ns | 934.13 ns | 87.67 | 10.11 | 9 | 0.0782 | - | 496 B | 6.89 | +| NClone | 904.75 ns | 33.559 ns | 98.949 ns | 919.05 ns | 88.27 | 9.73 | 9 | 0.1488 | - | 936 B | 13.00 | +| SystemTextJson | 1,687.39 ns | 70.341 ns | 201.821 ns | 1,766.14 ns | 164.63 | 19.79 | 10 | 0.1755 | - | 1120 B | 15.56 | +| NewtonsoftJson | 3,147.66 ns | 109.097 ns | 321.676 ns | 3,269.96 ns | 307.10 | 31.67 | 11 | 0.7286 | 0.0038 | 4592 B | 63.78 | +| FastDeepCloner | 3,970.90 ns | 155.503 ns | 458.505 ns | 4,128.09 ns | 387.41 | 45.01 | 12 | 0.2060 | - | 1304 B | 18.11 | +| AnyCloneBenchmark | 5,102.40 ns | 239.089 ns | 704.959 ns | 5,370.93 ns | 497.81 | 68.98 | 13 | 0.9003 | - | 5656 B | 78.56 | +``` + +You can run the benchmark [locally](https://github.com/lofcz/FastCloner/blob/next/src/FastCloner.Benchmark/BenchMinimal.cs) to verify the results. There are also [third-party benchmarks](https://github.com/AnderssonPeter/Dolly?tab=readme-ov-file#benchmarks) in some of the competing libraries confirming these results. + +### Build Times & IDE Performance + +FastCloner's source generator is carefully engineered for zero impact on IDE responsiveness and swift build times. + +- **Tiered Caching**: We use `ForAttributeWithMetadataName` for highly efficient filtering and strictly separate syntax analysis from code generation. +- **Smart Models**: Roslyn symbols are immediately projected into lightweight, cache-friendly `TypeModel` records. The generator never holds onto compilation symbols, allowing the incremental pipeline to perfectly cache previous results. +- **No Compilation Trashing**: We avoid expensive `CompilationProvider` combinations that break generator caching. Code generation only re-runs when your data models actually change, not on every keystroke or unrelated edit. +- **Allocation Free**: `EquatableArray` collections ensure that change detection is instant and creates no garbage collection pressure. + +## Contributing + +If you are looking to add new functionality, please open an issue first to verify your intent is aligned with the scope of the project. The library is covered by over [700 tests](https://github.com/lofcz/FastCloner/tree/next/src/FastCloner.Tests), please run them against your work before proposing changes. When reporting issues, providing a minimal reproduction we can plug in as a new test greatly reduces turnaround time. + +## License + +This library is licensed under the [MIT](https://github.com/lofcz/FastCloner/blob/next/LICENSE) license. 💜 + + +::: + +### About +:::note + +Cloning objects + + +::: + +## How to use + +### Example (source csproj, source files) + + + + + +This is the CSharp Project that references **FastCloner** +```xml showLineNumbers {14} + + + + Exe + net9.0 + enable + enable + + + true + $(BaseIntermediateOutputPath)\GX + + + + + + + + +``` + + + + + + This is the use of **FastCloner** in *Program.cs* + +```csharp showLineNumbers +using CloneData; + +Console.WriteLine("Hello, World!"); +Person p = new (); +p.FirstName = "Andrei"; +p.LastName = "Ignat"; +p.Age = 54; +var p1=p.FastDeepClone(); +Console.WriteLine(p1.Name()); +``` + + + + + This is the use of **FastCloner** in *Person.cs* + +```csharp showLineNumbers + +using FastCloner.SourceGenerator.Shared; + +namespace CloneData; +[FastClonerClonable] +public partial class Person +{ + public string FirstName \{ get; set; \} = ""; + public string LastName \{ get; set; \} = ""; + public int Age \{ get; set; } + public string Name() => $"{FirstName} {LastName}"; + + public Person[] Childs \{ get; set; \} = []; +} + +``` + + + + +### Generated Files + +Those are taken from $(BaseIntermediateOutputPath)\GX + + + + +```csharp showLineNumbers +using System; + +namespace Dolly +{ + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)] + public class ClonableAttribute : Attribute + { + } +} +``` + + + + +```csharp showLineNumbers +using System; + +namespace Dolly +{ + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] + public class CloneIgnoreAttribute : Attribute + { + } +} +``` + + + + +```csharp showLineNumbers +using System; +namespace Dolly +{ + public interface IClonable : ICloneable + { + T DeepClone(); + T ShallowClone(); + } +} +``` + + + + +```csharp showLineNumbers +using Dolly; +using System.Linq; +namespace CloneData; +partial class Person : IClonable +{ + object ICloneable.Clone() => this.DeepClone(); + public virtual Person DeepClone() => + new () + { + FirstName = FirstName, + LastName = LastName, + Childs = Childs.Select(item => item.DeepClone()).ToArray() + }; + + public virtual Person ShallowClone() => + new () + { + FirstName = FirstName, + LastName = LastName, + Childs = Childs.ToArray() + }; +} +``` + + + + +```csharp showLineNumbers +// +// Generated: 2026-02-03 05:29:59 UTC +#nullable enable + +using System; +using System.Collections.Generic; +using System.Reflection; +using FastCloner.SourceGenerator.Shared; +using FastCloner; + +namespace CloneData +{ + /// + /// Extension methods for cloning Person. + /// + public static partial class PersonFastDeepCloneExtensions + { + /// + /// Performs deep clone of Person. This is a source generated method. + /// + /// The object to clone. + [return: global::System.Diagnostics.CodeAnalysis.NotNullIfNotNull("source")] + public static global::CloneData.Person? FastDeepClone(this global::CloneData.Person? source) + { + return InternalFastDeepClone(source, null); + } + + /// + /// Performs deep clone of Person with circular reference tracking. + /// + /// The object to clone. + /// State for circular reference tracking. If null, a new state is created. + internal static global::CloneData.Person? InternalFastDeepClone(this global::CloneData.Person? source, FcGeneratedCloneState? state) + { + if (source == null) return null; + var localState = state ?? new FcGeneratedCloneState(); + var known = localState.GetKnownRef(source); + if (known != null) return (global::CloneData.Person)known; + var result = new global::CloneData.Person(); + localState?.AddKnownRef(source, result); + + result.FirstName = source.FirstName; + result.LastName = source.LastName; + result.Age = source.Age; + result.Childs = FastClonerSgCloneCloneData_Person__(source.Childs, localState); + + return result; + } + + private static global::CloneData.Person[]? FastClonerSgCloneCloneData_Person__(global::CloneData.Person[]? source, FcGeneratedCloneState? state) + { + if (source == null) return null; + if (state != null) + { + var known = state.GetKnownRef(source); + if (known != null) return (global::CloneData.Person[])known; + } + + var result = new global::CloneData.Person[source.Length]; + state?.AddKnownRef(source, result); + + for (int i = 0; i < source.Length; i++) + { + result[i] = source[i]?.FastDeepClone(); + } + + return result; + } + + } +} + +``` + + + + +## Useful + +### Download Example (.NET C#) + +:::tip + +[Download Example project FastCloner ](/sources/FastCloner.zip) + +::: + + +### Share FastCloner + + + +https://ignatandrei.github.io/RSCG_Examples/v2/docs/FastCloner + + + diff --git a/v2/rscg_examples_site/docs/RSCG-Examples/index.md b/v2/rscg_examples_site/docs/RSCG-Examples/index.md index 29a00b7f2..2663acde9 100644 --- a/v2/rscg_examples_site/docs/RSCG-Examples/index.md +++ b/v2/rscg_examples_site/docs/RSCG-Examples/index.md @@ -1,7 +1,7 @@ --- sidebar_position: 30 -title: 252 RSCG list by category -description: 252 RSCG list by category +title: 253 RSCG list by category +description: 253 RSCG list by category slug: /rscg-examples --- @@ -236,7 +236,7 @@ import DocCardList from '@theme/DocCardList'; ## Clone
- Expand Clone =>examples:3 + Expand Clone =>examples:4 @@ -252,6 +252,11 @@ import DocCardList from '@theme/DocCardList'; [UtilityVerse.Copy](/docs/UtilityVerse.Copy) + + + +[FastCloner](/docs/FastCloner) +
@@ -1660,6 +1665,8 @@ flowchart LR; Clone--> UtilityVerse.Copy((UtilityVerse.Copy)) + Clone--> FastCloner((FastCloner)) + CodeToString--> SourceGenerator.Helper.CopyCode((SourceGenerator.Helper.CopyCode)) CodeToString--> CodeAnalysis((CodeAnalysis)) diff --git a/v2/rscg_examples_site/docs/about.md b/v2/rscg_examples_site/docs/about.md index 9b29f1be3..25af1865e 100644 --- a/v2/rscg_examples_site/docs/about.md +++ b/v2/rscg_examples_site/docs/about.md @@ -6,7 +6,7 @@ title: About ## Content You will find here code examples -of 252 Roslyn Source Code Generator (RSCG) +of 253 Roslyn Source Code Generator (RSCG) that can be useful for you. That means, you will write more elegant and concise code - even if the generators code is not always nice to look. ## Are those examples ready for production? diff --git a/v2/rscg_examples_site/docs/indexRSCG.md b/v2/rscg_examples_site/docs/indexRSCG.md index ac90bcded..34d20eb15 100644 --- a/v2/rscg_examples_site/docs/indexRSCG.md +++ b/v2/rscg_examples_site/docs/indexRSCG.md @@ -7,9 +7,9 @@ slug: /List-of-RSCG import useBaseUrl from '@docusaurus/useBaseUrl'; -## 252 RSCG with examples in descending chronological order +## 253 RSCG with examples in descending chronological order -This is the list of 252 ( 16 from Microsoft) RSCG with examples +This is the list of 253 ( 16 from Microsoft) RSCG with examples [See by category](/docs/rscg-examples) [See as json](/exports/RSCG.json) [See as Excel](/exports/RSCG.xlsx) @@ -20,6 +20,7 @@ This is the list of 252 ( 16 from Microsoft) RSCG with examples | No | Name | Date | Category | | --------- | ----- | ---- | -------- | +|253| [FastCloner by Matěj Štágl ](/docs/FastCloner)|2026-02-01 => 01 February 2026 | [Clone](/docs/Categories/Clone) | |252| [RSCG_idempotency by Ignat Andrei ](/docs/RSCG_idempotency)|2026-01-28 => 28 January 2026 | [Idempotency](/docs/Categories/Idempotency) | |251| [OrderedBuildersGenerator by Georgiy Petrov ](/docs/OrderedBuildersGenerator)|2025-12-18 => 18 December 2025 | [Builder](/docs/Categories/Builder) | |250| [Facet.Search by Tim Maes ](/docs/Facet.Search)|2025-12-17 => 17 December 2025 | [Database](/docs/Categories/Database) | diff --git a/v2/rscg_examples_site/src/components/HomepageFeatures/index.js b/v2/rscg_examples_site/src/components/HomepageFeatures/index.js index 225a0eecb..45e7e002d 100644 --- a/v2/rscg_examples_site/src/components/HomepageFeatures/index.js +++ b/v2/rscg_examples_site/src/components/HomepageFeatures/index.js @@ -4,7 +4,7 @@ import styles from './styles.module.css'; const FeatureList = [ { -title: '252 Examples (16 from MSFT)', +title: '253 Examples (16 from MSFT)', Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, description: ( <> diff --git a/v2/rscg_examples_site/static/exports/RSCG.json b/v2/rscg_examples_site/static/exports/RSCG.json index 210d8f9cf..a925ba2f0 100644 --- a/v2/rscg_examples_site/static/exports/RSCG.json +++ b/v2/rscg_examples_site/static/exports/RSCG.json @@ -2017,6 +2017,14 @@ "Source": "https://github.com/ignatandrei/RSCG_idempotency", "Category": "Idempotency", "AddedOn": "2026-01-28T00:00:00" + }, + { + "Name": "FastCloner", + "Link": "https://ignatandrei.github.io/RSCG_Examples/v2/docs/FastCloner", + "NuGet": "https://www.nuget.org/packages/FastCloner/", + "Source": "https://github.com/lofcz/FastCloner/", + "Category": "Clone", + "AddedOn": "2026-02-01T00:00:00" } ] } \ No newline at end of file diff --git a/v2/rscg_examples_site/static/exports/RSCG.xlsx b/v2/rscg_examples_site/static/exports/RSCG.xlsx index 6bd107fbb..e7b85fa24 100644 Binary files a/v2/rscg_examples_site/static/exports/RSCG.xlsx and b/v2/rscg_examples_site/static/exports/RSCG.xlsx differ diff --git a/v2/rscg_examples_site/static/sources/FastCloner.zip b/v2/rscg_examples_site/static/sources/FastCloner.zip new file mode 100644 index 000000000..365bf3867 Binary files /dev/null and b/v2/rscg_examples_site/static/sources/FastCloner.zip differ