Repository files navigation

CodeGenerator

This is a small .NET library that enables easy C# code generation based on Classes and its elements.
It has ability to create ClassModels (POCO object generator) and Methods and write it to .cs files.
Can specify their Members (Constructor, Field, Property, Method) including Attributes and Parameters.
Defining namespace and using Directives is supported as well.
Library can also generate Enums and Interfaces, and create NestedClasses inside parent class.

BaseElement has Config for: IndentSize, Comment, CommentHasSummaryTag(df:true), AccessModifier, BuiltInDataType, CustomDataType, Name
Property more Config: IsGetOnly, IsAutoImplemented, GetterBody, SetterBody
CsGenerator Settings are: DefaultTabSize: 4 | OutputDirectory: "Output" |
-- List of components --
AccessModifier: public, private, protected, internal, protected_internal
BuiltInDataType: void, bool, byte, int, long, decimal, float, double, char, string, object
CommonDataType: DateTime, Guid
KeyWord: this, abstract, partial, static, new, virtual, override, sealed, const, async, readOnly
IndentType: None, Single, Double, Triple, Quadruple

For more complex code with indented segments specific Indent value should be set (prepend in a loop) for all internal lines/elements.

Package targets .NET Standard 2.0 so can be used both with .NetFramework and .NetCore / .Net (new unified)

Logo:

NuGet

Installation

Available on NuGet latest version.
Package manager console command for installation: Install-Package CsCodeGenerator

Support

If you find this project useful you can mark it by leaving a Github Star
If you want help development, you can become a CONTRIBUTOR or you can make a DONATION:
Buy Me A Coffee _ or _ Button
Want to Contact for Development & Consulting: www.codis.tech (Quality Assurance)

Contributing

Please read CONTRIBUTING for details on code of conduct, and the process for submitting pull requests.
When opening issues do write detailed explanation of the problem or feature with reproducible example.

**Also take a look into others packages:
Open source (MIT or cFOSS) authored .Net libraries (@Infopedia.io personal blog post)

.Net libraryDescription
1EFCore.BulkExtensionsEF Core Bulk CRUD Ops (Flagship Lib)
2EFCore.UtilExtensionsEF Core Custom Annotations and AuditInfo
3EFCore.FluentApiToAnnotationConverting FluentApi configuration to Annotations
4FixedWidthParserWriterReading & Writing fixed-width/flat data files
5*CsCodeGeneratorC# code generation based on Classes and elements
6CsCodeExampleExamples of C# code in form of a simple tutorial

GeneratorModel Structure:

Class Inheritance Hierarchy

|-*BaseElement
ClassModel :-----|Property:-- Field :----------|Constructor: Method :---------|EnumModel:------|InterfaceModel:-|

Component Composition

CsGenerator||---Files||---Enums||---Classes||---Fields||---Constructors(DefaultConstructorfirst)||---Attributes|||---Parameters||||---Parameters||---Properties||---Attributes|||---Parameters||||---Parameters||---Methods||---Attributes|||---Parameters||||---Parameters||---NestedClasses(recursively)|--- ...

How to use it

Following is first example of ComplexNumber class and then creating its ClassModel for writing to Complex.cs
There are 2 option to configure it:
-one is using Fluent methods (A)
-and other with pure classes and properties (B)

Class we want to generate:

usingSystem;usingSystem.Model;namespaceCsCodeGenerator.Tests{[Description("Some class info")]publicpartialclassComplexNumber:SomeBaseClass,NumbericInterface{protectedconstdoublePI=3.14;privatestringremark;publicComplexNumber(){}publicComplexNumber(doublereal,doubleimaginary=0){Real=real;Imaginary=imaginary;}publicstaticstringDefaultFormat{get;}="a + b * i";publicdoubleReal{get;set;}publicdoubleImaginary{get;set;}publicvirtualstringRemark{get{returnremark;}set{remark=value;}}publicdoubleModul(){returnMath.Sqrt(Real*Real+Imaginary*Imaginary);}publicComplexNumberAdd(ComplexNumberinput){ComplexNumberresult=newComplexNumber();result.Real=Real+input.Real;result.Imaginary=Imaginary+input.Imaginary;returnresult;}/// <summary>// example of 2 KeyWords(new and virtual), usually here would be just virtual/// <summary>publicnewvirtualstringToString(){return$"({Real:0.00}, {Imaginary:0.00})";}}}

A) Code to do it with Fluent methods - shorter code and more readable syntax. [WithElement() such as WithProperty]. Fluent calls are composed with BaseElement, when configuring deeper level we need to instanciate with New and call in the scope.
To be able to get subElements returned to main scope (like EFCore FluentAPI setting works) then more extension methods would be needed - one example is commented in source code: WithPropertyReturn.

varusingDirectives=newList<string>{"System;","System.ComponentModel;"};stringfileNameSpace="CsCodeGenerator.Tests";stringcomplexNumberText="ComplexNumber";// ClassvarclassModel=newClassModel();varindent=classModel.Indent;varcomplexNumberClass=(ClassModel)classModel.WithAttribute(newAttributeModel("Description").WithParameter(@"""Some class info""")).WithKeyWord(KeyWord.Partial).WithName(complexNumberText).WithConstructor(newConstructor(complexNumberText){BracesInNewLine=false}).WithConstructor(newConstructor(complexNumberText).WithParameter(BuiltInDataType.Double,"real",null).WithParameter(BuiltInDataType.Double,"imaginary","0").WithBodyLine("Real = real;").WithBodyLine("Imaginary = imaginary;")).WithField(newField(BuiltInDataType.Double,"PI"){SingleKeyWord=KeyWord.Const,DefaultValue="3.14"}).WithField(newField(BuiltInDataType.String,"remark"){AccessModifier=AccessModifier.Private}).WithProperty(newProperty(BuiltInDataType.String,"DefaultFormat"){SingleKeyWord=KeyWord.Static,IsGetOnly=true,DefaultValue=@"""a + b * i"""}).WithProperty(BuiltInDataType.Double,"Real").WithProperty(BuiltInDataType.Double,"Imaginary").WithProperty(newProperty(BuiltInDataType.String,"Remark"){SingleKeyWord=KeyWord.Virtual,IsAutoImplemented=false}.WithGetter("remark").WithSetter("remark = value")).WithMethod(newMethod(BuiltInDataType.Double,"Modul").WithBodyLine("return Math.Sqrt(Real * Real + Imaginary * Imaginary);")).WithMethod(newMethod(complexNumberText,"Add").WithParameter(complexNumberText,"input",null).WithBodyLine("ComplexNumber result = new ComplexNumber").WithBodyLine("{").AddIndent().WithBodyLine("Real = Real + input.Real,").WithBodyLine("Imaginary = Imaginary + input.Imaginary,").RemoveIndent().WithBodyLine("};").WithBodyLine("return result;")).WithMethod(newMethod(BuiltInDataType.String,"ToString"){KeyWords=[KeyWord.New,KeyWord.Virtual],Comment="example of 2 KeyWords(new and virtual), usually here would be just virtual"}.WithBodyLine("return $\"({Real:0.00}, {Imaginary:0.00})\";"));varcomplexNumberFile=newFileModel(complexNumberText);complexNumberFile.LoadUsingDirectives(usingDirectives);complexNumberFile.Namespace=fileNameSpace;complexNumberFile.Classes.Add(complexNumberClass);varcsGenerator=newCsGenerator();csGenerator.Files.Add(complexNumberFile);csGenerator.CreateFiles();

B) Alternative way without Fluent:

varusingDirectives=newList<string>{"using System;","using System.ComponentModel;"};stringfileNameSpace=$"{Util.Namespace} CsCodeGenerator.Tests";stringcomplexNumberText="ComplexNumber";ClassModelcomplexNumberClass=newClassModel(complexNumberText);complexNumberClass.SingleKeyWord=KeyWord.Partial;// one way to set single KeyWord//complexNumberClass.KeyWords.Add(KeyWord.Partial); // or alternative waycomplexNumberClass.BaseClass="SomeBaseClass";complexNumberClass.Interfaces.Add("NumbericInterface)";vardescriptionAttribute=newAttributeModel("Description"){SingleParameter=newParameter(@"""Some class info""")};complexNumberClass.AddAttribute(descriptionAttribute);complexNumberClass.DefaultConstructor.IsVisible=true;ConstructorsecondConstructor=newConstructor(complexNumberClass.Name);secondConstructor.Parameters.Add(newParameter(BuiltInDataType.Double,"real"));secondConstructor.Parameters.Add(newParameter(BuiltInDataType.Double,"imaginary"){Value="0"});secondConstructor.BodyLines.Add("Real = real;");secondConstructor.BodyLines.Add("Imaginary = imaginary;");complexNumberClass.Constructors.Add(secondConstructor);varfields=newField[]{newField(BuiltInDataType.Double,"PI"){SingleKeyWord=KeyWord.Const,DefaultValue="3.14"},newField(BuiltInDataType.String,"remark"){AccessModifier=AccessModifier.Private},}.ToDictionary(a =>a.Name, a =>a);varproperties=newProperty[]{newProperty(BuiltInDataType.String,"DefaultFormat"){SingleKeyWord=KeyWord.Static,IsGetOnly=true,DefaultValue=@"""a + b * i"""},newProperty(BuiltInDataType.Double,"Real"),newProperty(BuiltInDataType.Double,"Imaginary"),newProperty(BuiltInDataType.String,"Remark"){SingleKeyWord=KeyWord.Virtual,IsAutoImplemented=false,GetterBody="remark",SetterBody="remark = value"},}.ToDictionary(a =>a.Name, a =>a);varmethods=newMethod[]{newMethod(BuiltInDataType.Double,"Modul"){BodyLines=newList<string>{"return Math.Sqrt(Real * Real + Imaginary * Imaginary);"}},newMethod(complexNumberText,"Add"){Parameters=newList<Parameter>{newParameter("ComplexNumber","input",null)},BodyLines=newList<string>{"ComplexNumber result = new ComplexNumber();","result.Real = Real + input.Real;","result.Imaginary = Imaginary + input.Imaginary;","return result;"}},newMethod(BuiltInDataType.String,"ToString"){Comment="example of 2 KeyWords(new and virtual), usually here just virtual",KeyWords=newList<KeyWord>{KeyWord.New,KeyWord.Virtual},BodyLines=newList<string>{"return $\"({Real:0.00}, {Imaginary:0.00})\";"}}}.ToDictionary(a =>a.Name, a =>a);complexNumberClass.Fields=fields;complexNumberClass.Properties=properties;complexNumberClass.Methods=methods;FileModelcomplexNumberFile=newFileModel(complexNumberText);complexNumberFile.LoadUsingDirectives(usingDirectives);complexNumberFile.Namespace=fileNameSpace;complexNumberFile.Classes.Add(complexNumberClass.Name,complexNumberClass);CsGeneratorcsGenerator=newCsGenerator();csGenerator.Files.Add(complexNumberFile.Name,complexNumberFile);csGenerator.CreateFiles();//Console.Write(complexNumberFile); 

About

Easy C# class and code generation, POCO object and Methods creation

Topics

Resources

Code of conduct

Contributing

Stars

116 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

CodeGenerator

This is a small .NET library that enables easy C# code generation based on Classes and its elements.
It has ability to create ClassModels (POCO object generator) and Methods and write it to .cs files.
Can specify their Members (Constructor, Field, Property, Method) including Attributes and Parameters.
Defining namespace and using Directives is supported as well.
Library can also generate Enums and Interfaces, and create NestedClasses inside parent class.

BaseElement has Config for: IndentSize, Comment, CommentHasSummaryTag(df:true), AccessModifier, BuiltInDataType, CustomDataType, Name
Property more Config: IsGetOnly, IsAutoImplemented, GetterBody, SetterBody
CsGenerator Settings are: DefaultTabSize: 4 | OutputDirectory: "Output" |
-- List of components --
AccessModifier: public, private, protected, internal, protected_internal
BuiltInDataType: void, bool, byte, int, long, decimal, float, double, char, string, object
CommonDataType: DateTime, Guid
KeyWord: this, abstract, partial, static, new, virtual, override, sealed, const, async, readOnly
IndentType: None, Single, Double, Triple, Quadruple

For more complex code with indented segments specific Indent value should be set (prepend in a loop) for all internal lines/elements.

Package targets .NET Standard 2.0 so can be used both with .NetFramework and .NetCore / .Net (new unified)

Logo:

NuGet

Installation

Available on NuGet latest version.
Package manager console command for installation: Install-Package CsCodeGenerator

Support

If you find this project useful you can mark it by leaving a Github Star
If you want help development, you can become a CONTRIBUTOR or you can make a DONATION:
Buy Me A Coffee _ or _ Button
Want to Contact for Development & Consulting: www.codis.tech (Quality Assurance)

Contributing

Please read CONTRIBUTING for details on code of conduct, and the process for submitting pull requests.
When opening issues do write detailed explanation of the problem or feature with reproducible example.

**Also take a look into others packages:
Open source (MIT or cFOSS) authored .Net libraries (@Infopedia.io personal blog post)

.Net libraryDescription
1EFCore.BulkExtensionsEF Core Bulk CRUD Ops (Flagship Lib)
2EFCore.UtilExtensionsEF Core Custom Annotations and AuditInfo
3EFCore.FluentApiToAnnotationConverting FluentApi configuration to Annotations
4FixedWidthParserWriterReading & Writing fixed-width/flat data files
5*CsCodeGeneratorC# code generation based on Classes and elements
6CsCodeExampleExamples of C# code in form of a simple tutorial

GeneratorModel Structure:

Class Inheritance Hierarchy

|-*BaseElement
ClassModel :-----|Property:-- Field :----------|Constructor: Method :---------|EnumModel:------|InterfaceModel:-|

Component Composition

CsGenerator||---Files||---Enums||---Classes||---Fields||---Constructors(DefaultConstructorfirst)||---Attributes|||---Parameters||||---Parameters||---Properties||---Attributes|||---Parameters||||---Parameters||---Methods||---Attributes|||---Parameters||||---Parameters||---NestedClasses(recursively)|--- ...

How to use it

Following is first example of ComplexNumber class and then creating its ClassModel for writing to Complex.cs
There are 2 option to configure it:
-one is using Fluent methods (A)
-and other with pure classes and properties (B)

Class we want to generate:

usingSystem;usingSystem.Model;namespaceCsCodeGenerator.Tests{[Description("Some class info")]publicpartialclassComplexNumber:SomeBaseClass,NumbericInterface{protectedconstdoublePI=3.14;privatestringremark;publicComplexNumber(){}publicComplexNumber(doublereal,doubleimaginary=0){Real=real;Imaginary=imaginary;}publicstaticstringDefaultFormat{get;}="a + b * i";publicdoubleReal{get;set;}publicdoubleImaginary{get;set;}publicvirtualstringRemark{get{returnremark;}set{remark=value;}}publicdoubleModul(){returnMath.Sqrt(Real*Real+Imaginary*Imaginary);}publicComplexNumberAdd(ComplexNumberinput){ComplexNumberresult=newComplexNumber();result.Real=Real+input.Real;result.Imaginary=Imaginary+input.Imaginary;returnresult;}/// <summary>// example of 2 KeyWords(new and virtual), usually here would be just virtual/// <summary>publicnewvirtualstringToString(){return$"({Real:0.00}, {Imaginary:0.00})";}}}

A) Code to do it with Fluent methods - shorter code and more readable syntax. [WithElement() such as WithProperty]. Fluent calls are composed with BaseElement, when configuring deeper level we need to instanciate with New and call in the scope.
To be able to get subElements returned to main scope (like EFCore FluentAPI setting works) then more extension methods would be needed - one example is commented in source code: WithPropertyReturn.

varusingDirectives=newList<string>{"System;","System.ComponentModel;"};stringfileNameSpace="CsCodeGenerator.Tests";stringcomplexNumberText="ComplexNumber";// ClassvarclassModel=newClassModel();varindent=classModel.Indent;varcomplexNumberClass=(ClassModel)classModel.WithAttribute(newAttributeModel("Description").WithParameter(@"""Some class info""")).WithKeyWord(KeyWord.Partial).WithName(complexNumberText).WithConstructor(newConstructor(complexNumberText){BracesInNewLine=false}).WithConstructor(newConstructor(complexNumberText).WithParameter(BuiltInDataType.Double,"real",null).WithParameter(BuiltInDataType.Double,"imaginary","0").WithBodyLine("Real = real;").WithBodyLine("Imaginary = imaginary;")).WithField(newField(BuiltInDataType.Double,"PI"){SingleKeyWord=KeyWord.Const,DefaultValue="3.14"}).WithField(newField(BuiltInDataType.String,"remark"){AccessModifier=AccessModifier.Private}).WithProperty(newProperty(BuiltInDataType.String,"DefaultFormat"){SingleKeyWord=KeyWord.Static,IsGetOnly=true,DefaultValue=@"""a + b * i"""}).WithProperty(BuiltInDataType.Double,"Real").WithProperty(BuiltInDataType.Double,"Imaginary").WithProperty(newProperty(BuiltInDataType.String,"Remark"){SingleKeyWord=KeyWord.Virtual,IsAutoImplemented=false}.WithGetter("remark").WithSetter("remark = value")).WithMethod(newMethod(BuiltInDataType.Double,"Modul").WithBodyLine("return Math.Sqrt(Real * Real + Imaginary * Imaginary);")).WithMethod(newMethod(complexNumberText,"Add").WithParameter(complexNumberText,"input",null).WithBodyLine("ComplexNumber result = new ComplexNumber").WithBodyLine("{").AddIndent().WithBodyLine("Real = Real + input.Real,").WithBodyLine("Imaginary = Imaginary + input.Imaginary,").RemoveIndent().WithBodyLine("};").WithBodyLine("return result;")).WithMethod(newMethod(BuiltInDataType.String,"ToString"){KeyWords=[KeyWord.New,KeyWord.Virtual],Comment="example of 2 KeyWords(new and virtual), usually here would be just virtual"}.WithBodyLine("return $\"({Real:0.00}, {Imaginary:0.00})\";"));varcomplexNumberFile=newFileModel(complexNumberText);complexNumberFile.LoadUsingDirectives(usingDirectives);complexNumberFile.Namespace=fileNameSpace;complexNumberFile.Classes.Add(complexNumberClass);varcsGenerator=newCsGenerator();csGenerator.Files.Add(complexNumberFile);csGenerator.CreateFiles();

B) Alternative way without Fluent:

varusingDirectives=newList<string>{"using System;","using System.ComponentModel;"};stringfileNameSpace=$"{Util.Namespace} CsCodeGenerator.Tests";stringcomplexNumberText="ComplexNumber";ClassModelcomplexNumberClass=newClassModel(complexNumberText);complexNumberClass.SingleKeyWord=KeyWord.Partial;// one way to set single KeyWord//complexNumberClass.KeyWords.Add(KeyWord.Partial); // or alternative waycomplexNumberClass.BaseClass="SomeBaseClass";complexNumberClass.Interfaces.Add("NumbericInterface)";vardescriptionAttribute=newAttributeModel("Description"){SingleParameter=newParameter(@"""Some class info""")};complexNumberClass.AddAttribute(descriptionAttribute);complexNumberClass.DefaultConstructor.IsVisible=true;ConstructorsecondConstructor=newConstructor(complexNumberClass.Name);secondConstructor.Parameters.Add(newParameter(BuiltInDataType.Double,"real"));secondConstructor.Parameters.Add(newParameter(BuiltInDataType.Double,"imaginary"){Value="0"});secondConstructor.BodyLines.Add("Real = real;");secondConstructor.BodyLines.Add("Imaginary = imaginary;");complexNumberClass.Constructors.Add(secondConstructor);varfields=newField[]{newField(BuiltInDataType.Double,"PI"){SingleKeyWord=KeyWord.Const,DefaultValue="3.14"},newField(BuiltInDataType.String,"remark"){AccessModifier=AccessModifier.Private},}.ToDictionary(a =>a.Name, a =>a);varproperties=newProperty[]{newProperty(BuiltInDataType.String,"DefaultFormat"){SingleKeyWord=KeyWord.Static,IsGetOnly=true,DefaultValue=@"""a + b * i"""},newProperty(BuiltInDataType.Double,"Real"),newProperty(BuiltInDataType.Double,"Imaginary"),newProperty(BuiltInDataType.String,"Remark"){SingleKeyWord=KeyWord.Virtual,IsAutoImplemented=false,GetterBody="remark",SetterBody="remark = value"},}.ToDictionary(a =>a.Name, a =>a);varmethods=newMethod[]{newMethod(BuiltInDataType.Double,"Modul"){BodyLines=newList<string>{"return Math.Sqrt(Real * Real + Imaginary * Imaginary);"}},newMethod(complexNumberText,"Add"){Parameters=newList<Parameter>{newParameter("ComplexNumber","input",null)},BodyLines=newList<string>{"ComplexNumber result = new ComplexNumber();","result.Real = Real + input.Real;","result.Imaginary = Imaginary + input.Imaginary;","return result;"}},newMethod(BuiltInDataType.String,"ToString"){Comment="example of 2 KeyWords(new and virtual), usually here just virtual",KeyWords=newList<KeyWord>{KeyWord.New,KeyWord.Virtual},BodyLines=newList<string>{"return $\"({Real:0.00}, {Imaginary:0.00})\";"}}}.ToDictionary(a =>a.Name, a =>a);complexNumberClass.Fields=fields;complexNumberClass.Properties=properties;complexNumberClass.Methods=methods;FileModelcomplexNumberFile=newFileModel(complexNumberText);complexNumberFile.LoadUsingDirectives(usingDirectives);complexNumberFile.Namespace=fileNameSpace;complexNumberFile.Classes.Add(complexNumberClass.Name,complexNumberClass);CsGeneratorcsGenerator=newCsGenerator();csGenerator.Files.Add(complexNumberFile.Name,complexNumberFile);csGenerator.CreateFiles();//Console.Write(complexNumberFile); 

About

Easy C# class and code generation, POCO object and Methods creation

Topics

Resources

Code of conduct

Contributing

Stars

116 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CodeGenerator

This is a small .NET library that enables easy C# code generation based on Classes and its elements.
It has ability to create ClassModels (POCO object generator) and Methods and write it to .cs files.
Can specify their Members (Constructor, Field, Property, Method) including Attributes and Parameters.
Defining namespace and using Directives is supported as well.
Library can also generate Enums and Interfaces, and create NestedClasses inside parent class.

BaseElement has Config for: IndentSize, Comment, CommentHasSummaryTag(df:true), AccessModifier, BuiltInDataType, CustomDataType, Name
Property more Config: IsGetOnly, IsAutoImplemented, GetterBody, SetterBody
CsGenerator Settings are: DefaultTabSize: 4 | OutputDirectory: "Output" |
-- List of components --
AccessModifier: public, private, protected, internal, protected_internal
BuiltInDataType: void, bool, byte, int, long, decimal, float, double, char, string, object
CommonDataType: DateTime, Guid
KeyWord: this, abstract, partial, static, new, virtual, override, sealed, const, async, readOnly
IndentType: None, Single, Double, Triple, Quadruple

For more complex code with indented segments specific Indent value should be set (prepend in a loop) for all internal lines/elements.

Package targets .NET Standard 2.0 so can be used both with .NetFramework and .NetCore / .Net (new unified)

Logo:

NuGet

Installation

Available on NuGet latest version.
Package manager console command for installation: Install-Package CsCodeGenerator

Support

If you find this project useful you can mark it by leaving a Github Star
If you want help development, you can become a CONTRIBUTOR or you can make a DONATION:
Buy Me A Coffee _ or _ Button
Want to Contact for Development & Consulting: www.codis.tech (Quality Assurance)

Contributing

Please read CONTRIBUTING for details on code of conduct, and the process for submitting pull requests.
When opening issues do write detailed explanation of the problem or feature with reproducible example.

**Also take a look into others packages:
Open source (MIT or cFOSS) authored .Net libraries (@Infopedia.io personal blog post)

.Net libraryDescription
1EFCore.BulkExtensionsEF Core Bulk CRUD Ops (Flagship Lib)
2EFCore.UtilExtensionsEF Core Custom Annotations and AuditInfo
3EFCore.FluentApiToAnnotationConverting FluentApi configuration to Annotations
4FixedWidthParserWriterReading & Writing fixed-width/flat data files
5*CsCodeGeneratorC# code generation based on Classes and elements
6CsCodeExampleExamples of C# code in form of a simple tutorial

GeneratorModel Structure:

Class Inheritance Hierarchy

|-*BaseElement
ClassModel :-----|Property:-- Field :----------|Constructor: Method :---------|EnumModel:------|InterfaceModel:-|

Component Composition

CsGenerator||---Files||---Enums||---Classes||---Fields||---Constructors(DefaultConstructorfirst)||---Attributes|||---Parameters||||---Parameters||---Properties||---Attributes|||---Parameters||||---Parameters||---Methods||---Attributes|||---Parameters||||---Parameters||---NestedClasses(recursively)|--- ...

How to use it

Following is first example of ComplexNumber class and then creating its ClassModel for writing to Complex.cs
There are 2 option to configure it:
-one is using Fluent methods (A)
-and other with pure classes and properties (B)

Class we want to generate:

usingSystem;usingSystem.Model;namespaceCsCodeGenerator.Tests{[Description("Some class info")]publicpartialclassComplexNumber:SomeBaseClass,NumbericInterface{protectedconstdoublePI=3.14;privatestringremark;publicComplexNumber(){}publicComplexNumber(doublereal,doubleimaginary=0){Real=real;Imaginary=imaginary;}publicstaticstringDefaultFormat{get;}="a + b * i";publicdoubleReal{get;set;}publicdoubleImaginary{get;set;}publicvirtualstringRemark{get{returnremark;}set{remark=value;}}publicdoubleModul(){returnMath.Sqrt(Real*Real+Imaginary*Imaginary);}publicComplexNumberAdd(ComplexNumberinput){ComplexNumberresult=newComplexNumber();result.Real=Real+input.Real;result.Imaginary=Imaginary+input.Imaginary;returnresult;}/// <summary>// example of 2 KeyWords(new and virtual), usually here would be just virtual/// <summary>publicnewvirtualstringToString(){return$"({Real:0.00}, {Imaginary:0.00})";}}}

A) Code to do it with Fluent methods - shorter code and more readable syntax. [WithElement() such as WithProperty]. Fluent calls are composed with BaseElement, when configuring deeper level we need to instanciate with New and call in the scope.
To be able to get subElements returned to main scope (like EFCore FluentAPI setting works) then more extension methods would be needed - one example is commented in source code: WithPropertyReturn.

varusingDirectives=newList<string>{"System;","System.ComponentModel;"};stringfileNameSpace="CsCodeGenerator.Tests";stringcomplexNumberText="ComplexNumber";// ClassvarclassModel=newClassModel();varindent=classModel.Indent;varcomplexNumberClass=(ClassModel)classModel.WithAttribute(newAttributeModel("Description").WithParameter(@"""Some class info""")).WithKeyWord(KeyWord.Partial).WithName(complexNumberText).WithConstructor(newConstructor(complexNumberText){BracesInNewLine=false}).WithConstructor(newConstructor(complexNumberText).WithParameter(BuiltInDataType.Double,"real",null).WithParameter(BuiltInDataType.Double,"imaginary","0").WithBodyLine("Real = real;").WithBodyLine("Imaginary = imaginary;")).WithField(newField(BuiltInDataType.Double,"PI"){SingleKeyWord=KeyWord.Const,DefaultValue="3.14"}).WithField(newField(BuiltInDataType.String,"remark"){AccessModifier=AccessModifier.Private}).WithProperty(newProperty(BuiltInDataType.String,"DefaultFormat"){SingleKeyWord=KeyWord.Static,IsGetOnly=true,DefaultValue=@"""a + b * i"""}).WithProperty(BuiltInDataType.Double,"Real").WithProperty(BuiltInDataType.Double,"Imaginary").WithProperty(newProperty(BuiltInDataType.String,"Remark"){SingleKeyWord=KeyWord.Virtual,IsAutoImplemented=false}.WithGetter("remark").WithSetter("remark = value")).WithMethod(newMethod(BuiltInDataType.Double,"Modul").WithBodyLine("return Math.Sqrt(Real * Real + Imaginary * Imaginary);")).WithMethod(newMethod(complexNumberText,"Add").WithParameter(complexNumberText,"input",null).WithBodyLine("ComplexNumber result = new ComplexNumber").WithBodyLine("{").AddIndent().WithBodyLine("Real = Real + input.Real,").WithBodyLine("Imaginary = Imaginary + input.Imaginary,").RemoveIndent().WithBodyLine("};").WithBodyLine("return result;")).WithMethod(newMethod(BuiltInDataType.String,"ToString"){KeyWords=[KeyWord.New,KeyWord.Virtual],Comment="example of 2 KeyWords(new and virtual), usually here would be just virtual"}.WithBodyLine("return $\"({Real:0.00}, {Imaginary:0.00})\";"));varcomplexNumberFile=newFileModel(complexNumberText);complexNumberFile.LoadUsingDirectives(usingDirectives);complexNumberFile.Namespace=fileNameSpace;complexNumberFile.Classes.Add(complexNumberClass);varcsGenerator=newCsGenerator();csGenerator.Files.Add(complexNumberFile);csGenerator.CreateFiles();

B) Alternative way without Fluent:

varusingDirectives=newList<string>{"using System;","using System.ComponentModel;"};stringfileNameSpace=$"{Util.Namespace} CsCodeGenerator.Tests";stringcomplexNumberText="ComplexNumber";ClassModelcomplexNumberClass=newClassModel(complexNumberText);complexNumberClass.SingleKeyWord=KeyWord.Partial;// one way to set single KeyWord//complexNumberClass.KeyWords.Add(KeyWord.Partial); // or alternative waycomplexNumberClass.BaseClass="SomeBaseClass";complexNumberClass.Interfaces.Add("NumbericInterface)";vardescriptionAttribute=newAttributeModel("Description"){SingleParameter=newParameter(@"""Some class info""")};complexNumberClass.AddAttribute(descriptionAttribute);complexNumberClass.DefaultConstructor.IsVisible=true;ConstructorsecondConstructor=newConstructor(complexNumberClass.Name);secondConstructor.Parameters.Add(newParameter(BuiltInDataType.Double,"real"));secondConstructor.Parameters.Add(newParameter(BuiltInDataType.Double,"imaginary"){Value="0"});secondConstructor.BodyLines.Add("Real = real;");secondConstructor.BodyLines.Add("Imaginary = imaginary;");complexNumberClass.Constructors.Add(secondConstructor);varfields=newField[]{newField(BuiltInDataType.Double,"PI"){SingleKeyWord=KeyWord.Const,DefaultValue="3.14"},newField(BuiltInDataType.String,"remark"){AccessModifier=AccessModifier.Private},}.ToDictionary(a =>a.Name, a =>a);varproperties=newProperty[]{newProperty(BuiltInDataType.String,"DefaultFormat"){SingleKeyWord=KeyWord.Static,IsGetOnly=true,DefaultValue=@"""a + b * i"""},newProperty(BuiltInDataType.Double,"Real"),newProperty(BuiltInDataType.Double,"Imaginary"),newProperty(BuiltInDataType.String,"Remark"){SingleKeyWord=KeyWord.Virtual,IsAutoImplemented=false,GetterBody="remark",SetterBody="remark = value"},}.ToDictionary(a =>a.Name, a =>a);varmethods=newMethod[]{newMethod(BuiltInDataType.Double,"Modul"){BodyLines=newList<string>{"return Math.Sqrt(Real * Real + Imaginary * Imaginary);"}},newMethod(complexNumberText,"Add"){Parameters=newList<Parameter>{newParameter("ComplexNumber","input",null)},BodyLines=newList<string>{"ComplexNumber result = new ComplexNumber();","result.Real = Real + input.Real;","result.Imaginary = Imaginary + input.Imaginary;","return result;"}},newMethod(BuiltInDataType.String,"ToString"){Comment="example of 2 KeyWords(new and virtual), usually here just virtual",KeyWords=newList<KeyWord>{KeyWord.New,KeyWord.Virtual},BodyLines=newList<string>{"return $\"({Real:0.00}, {Imaginary:0.00})\";"}}}.ToDictionary(a =>a.Name, a =>a);complexNumberClass.Fields=fields;complexNumberClass.Properties=properties;complexNumberClass.Methods=methods;FileModelcomplexNumberFile=newFileModel(complexNumberText);complexNumberFile.LoadUsingDirectives(usingDirectives);complexNumberFile.Namespace=fileNameSpace;complexNumberFile.Classes.Add(complexNumberClass.Name,complexNumberClass);CsGeneratorcsGenerator=newCsGenerator();csGenerator.Files.Add(complexNumberFile.Name,complexNumberFile);csGenerator.CreateFiles();//Console.Write(complexNumberFile); 

About

Easy C# class and code generation, POCO object and Methods creation

Topics

Resources

Code of conduct

Contributing

Stars

116 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CodeGenerator

This is a small .NET library that enables easy C# code generation based on Classes and its elements.
It has ability to create ClassModels (POCO object generator) and Methods and write it to .cs files.
Can specify their Members (Constructor, Field, Property, Method) including Attributes and Parameters.
Defining namespace and using Directives is supported as well.
Library can also generate Enums and Interfaces, and create NestedClasses inside parent class.

BaseElement has Config for: IndentSize, Comment, CommentHasSummaryTag(df:true), AccessModifier, BuiltInDataType, CustomDataType, Name
Property more Config: IsGetOnly, IsAutoImplemented, GetterBody, SetterBody
CsGenerator Settings are: DefaultTabSize: 4 | OutputDirectory: "Output" |
-- List of components --
AccessModifier: public, private, protected, internal, protected_internal
BuiltInDataType: void, bool, byte, int, long, decimal, float, double, char, string, object
CommonDataType: DateTime, Guid
KeyWord: this, abstract, partial, static, new, virtual, override, sealed, const, async, readOnly
IndentType: None, Single, Double, Triple, Quadruple

For more complex code with indented segments specific Indent value should be set (prepend in a loop) for all internal lines/elements.

Package targets .NET Standard 2.0 so can be used both with .NetFramework and .NetCore / .Net (new unified)

Logo:

NuGet

Installation

Available on NuGet latest version.
Package manager console command for installation: Install-Package CsCodeGenerator

Support

If you find this project useful you can mark it by leaving a Github Star
If you want help development, you can become a CONTRIBUTOR or you can make a DONATION:
Buy Me A Coffee _ or _ Button
Want to Contact for Development & Consulting: www.codis.tech (Quality Assurance)

Contributing

Please read CONTRIBUTING for details on code of conduct, and the process for submitting pull requests.
When opening issues do write detailed explanation of the problem or feature with reproducible example.

**Also take a look into others packages:
Open source (MIT or cFOSS) authored .Net libraries (@Infopedia.io personal blog post)

.Net libraryDescription
1EFCore.BulkExtensionsEF Core Bulk CRUD Ops (Flagship Lib)
2EFCore.UtilExtensionsEF Core Custom Annotations and AuditInfo
3EFCore.FluentApiToAnnotationConverting FluentApi configuration to Annotations
4FixedWidthParserWriterReading & Writing fixed-width/flat data files
5*CsCodeGeneratorC# code generation based on Classes and elements
6CsCodeExampleExamples of C# code in form of a simple tutorial

GeneratorModel Structure:

Class Inheritance Hierarchy

|-*BaseElement
ClassModel :-----|Property:-- Field :----------|Constructor: Method :---------|EnumModel:------|InterfaceModel:-|

Component Composition

CsGenerator||---Files||---Enums||---Classes||---Fields||---Constructors(DefaultConstructorfirst)||---Attributes|||---Parameters||||---Parameters||---Properties||---Attributes|||---Parameters||||---Parameters||---Methods||---Attributes|||---Parameters||||---Parameters||---NestedClasses(recursively)|--- ...

How to use it

Following is first example of ComplexNumber class and then creating its ClassModel for writing to Complex.cs
There are 2 option to configure it:
-one is using Fluent methods (A)
-and other with pure classes and properties (B)

Class we want to generate:

usingSystem;usingSystem.Model;namespaceCsCodeGenerator.Tests{[Description("Some class info")]publicpartialclassComplexNumber:SomeBaseClass,NumbericInterface{protectedconstdoublePI=3.14;privatestringremark;publicComplexNumber(){}publicComplexNumber(doublereal,doubleimaginary=0){Real=real;Imaginary=imaginary;}publicstaticstringDefaultFormat{get;}="a + b * i";publicdoubleReal{get;set;}publicdoubleImaginary{get;set;}publicvirtualstringRemark{get{returnremark;}set{remark=value;}}publicdoubleModul(){returnMath.Sqrt(Real*Real+Imaginary*Imaginary);}publicComplexNumberAdd(ComplexNumberinput){ComplexNumberresult=newComplexNumber();result.Real=Real+input.Real;result.Imaginary=Imaginary+input.Imaginary;returnresult;}/// <summary>// example of 2 KeyWords(new and virtual), usually here would be just virtual/// <summary>publicnewvirtualstringToString(){return$"({Real:0.00}, {Imaginary:0.00})";}}}

A) Code to do it with Fluent methods - shorter code and more readable syntax. [WithElement() such as WithProperty]. Fluent calls are composed with BaseElement, when configuring deeper level we need to instanciate with New and call in the scope.
To be able to get subElements returned to main scope (like EFCore FluentAPI setting works) then more extension methods would be needed - one example is commented in source code: WithPropertyReturn.

varusingDirectives=newList<string>{"System;","System.ComponentModel;"};stringfileNameSpace="CsCodeGenerator.Tests";stringcomplexNumberText="ComplexNumber";// ClassvarclassModel=newClassModel();varindent=classModel.Indent;varcomplexNumberClass=(ClassModel)classModel.WithAttribute(newAttributeModel("Description").WithParameter(@"""Some class info""")).WithKeyWord(KeyWord.Partial).WithName(complexNumberText).WithConstructor(newConstructor(complexNumberText){BracesInNewLine=false}).WithConstructor(newConstructor(complexNumberText).WithParameter(BuiltInDataType.Double,"real",null).WithParameter(BuiltInDataType.Double,"imaginary","0").WithBodyLine("Real = real;").WithBodyLine("Imaginary = imaginary;")).WithField(newField(BuiltInDataType.Double,"PI"){SingleKeyWord=KeyWord.Const,DefaultValue="3.14"}).WithField(newField(BuiltInDataType.String,"remark"){AccessModifier=AccessModifier.Private}).WithProperty(newProperty(BuiltInDataType.String,"DefaultFormat"){SingleKeyWord=KeyWord.Static,IsGetOnly=true,DefaultValue=@"""a + b * i"""}).WithProperty(BuiltInDataType.Double,"Real").WithProperty(BuiltInDataType.Double,"Imaginary").WithProperty(newProperty(BuiltInDataType.String,"Remark"){SingleKeyWord=KeyWord.Virtual,IsAutoImplemented=false}.WithGetter("remark").WithSetter("remark = value")).WithMethod(newMethod(BuiltInDataType.Double,"Modul").WithBodyLine("return Math.Sqrt(Real * Real + Imaginary * Imaginary);")).WithMethod(newMethod(complexNumberText,"Add").WithParameter(complexNumberText,"input",null).WithBodyLine("ComplexNumber result = new ComplexNumber").WithBodyLine("{").AddIndent().WithBodyLine("Real = Real + input.Real,").WithBodyLine("Imaginary = Imaginary + input.Imaginary,").RemoveIndent().WithBodyLine("};").WithBodyLine("return result;")).WithMethod(newMethod(BuiltInDataType.String,"ToString"){KeyWords=[KeyWord.New,KeyWord.Virtual],Comment="example of 2 KeyWords(new and virtual), usually here would be just virtual"}.WithBodyLine("return $\"({Real:0.00}, {Imaginary:0.00})\";"));varcomplexNumberFile=newFileModel(complexNumberText);complexNumberFile.LoadUsingDirectives(usingDirectives);complexNumberFile.Namespace=fileNameSpace;complexNumberFile.Classes.Add(complexNumberClass);varcsGenerator=newCsGenerator();csGenerator.Files.Add(complexNumberFile);csGenerator.CreateFiles();

B) Alternative way without Fluent:

varusingDirectives=newList<string>{"using System;","using System.ComponentModel;"};stringfileNameSpace=$"{Util.Namespace} CsCodeGenerator.Tests";stringcomplexNumberText="ComplexNumber";ClassModelcomplexNumberClass=newClassModel(complexNumberText);complexNumberClass.SingleKeyWord=KeyWord.Partial;// one way to set single KeyWord//complexNumberClass.KeyWords.Add(KeyWord.Partial); // or alternative waycomplexNumberClass.BaseClass="SomeBaseClass";complexNumberClass.Interfaces.Add("NumbericInterface)";vardescriptionAttribute=newAttributeModel("Description"){SingleParameter=newParameter(@"""Some class info""")};complexNumberClass.AddAttribute(descriptionAttribute);complexNumberClass.DefaultConstructor.IsVisible=true;ConstructorsecondConstructor=newConstructor(complexNumberClass.Name);secondConstructor.Parameters.Add(newParameter(BuiltInDataType.Double,"real"));secondConstructor.Parameters.Add(newParameter(BuiltInDataType.Double,"imaginary"){Value="0"});secondConstructor.BodyLines.Add("Real = real;");secondConstructor.BodyLines.Add("Imaginary = imaginary;");complexNumberClass.Constructors.Add(secondConstructor);varfields=newField[]{newField(BuiltInDataType.Double,"PI"){SingleKeyWord=KeyWord.Const,DefaultValue="3.14"},newField(BuiltInDataType.String,"remark"){AccessModifier=AccessModifier.Private},}.ToDictionary(a =>a.Name, a =>a);varproperties=newProperty[]{newProperty(BuiltInDataType.String,"DefaultFormat"){SingleKeyWord=KeyWord.Static,IsGetOnly=true,DefaultValue=@"""a + b * i"""},newProperty(BuiltInDataType.Double,"Real"),newProperty(BuiltInDataType.Double,"Imaginary"),newProperty(BuiltInDataType.String,"Remark"){SingleKeyWord=KeyWord.Virtual,IsAutoImplemented=false,GetterBody="remark",SetterBody="remark = value"},}.ToDictionary(a =>a.Name, a =>a);varmethods=newMethod[]{newMethod(BuiltInDataType.Double,"Modul"){BodyLines=newList<string>{"return Math.Sqrt(Real * Real + Imaginary * Imaginary);"}},newMethod(complexNumberText,"Add"){Parameters=newList<Parameter>{newParameter("ComplexNumber","input",null)},BodyLines=newList<string>{"ComplexNumber result = new ComplexNumber();","result.Real = Real + input.Real;","result.Imaginary = Imaginary + input.Imaginary;","return result;"}},newMethod(BuiltInDataType.String,"ToString"){Comment="example of 2 KeyWords(new and virtual), usually here just virtual",KeyWords=newList<KeyWord>{KeyWord.New,KeyWord.Virtual},BodyLines=newList<string>{"return $\"({Real:0.00}, {Imaginary:0.00})\";"}}}.ToDictionary(a =>a.Name, a =>a);complexNumberClass.Fields=fields;complexNumberClass.Properties=properties;complexNumberClass.Methods=methods;FileModelcomplexNumberFile=newFileModel(complexNumberText);complexNumberFile.LoadUsingDirectives(usingDirectives);complexNumberFile.Namespace=fileNameSpace;complexNumberFile.Classes.Add(complexNumberClass.Name,complexNumberClass);CsGeneratorcsGenerator=newCsGenerator();csGenerator.Files.Add(complexNumberFile.Name,complexNumberFile);csGenerator.CreateFiles();//Console.Write(complexNumberFile); 

About

Easy C# class and code generation, POCO object and Methods creation

Topics

Resources

Code of conduct

Contributing

Stars

116 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

CodeGenerator

This is a small .NET library that enables easy C# code generation based on Classes and its elements.
It has ability to create ClassModels (POCO object generator) and Methods and write it to .cs files.
Can specify their Members (Constructor, Field, Property, Method) including Attributes and Parameters.
Defining namespace and using Directives is supported as well.
Library can also generate Enums and Interfaces, and create NestedClasses inside parent class.

BaseElement has Config for: IndentSize, Comment, CommentHasSummaryTag(df:true), AccessModifier, BuiltInDataType, CustomDataType, Name
Property more Config: IsGetOnly, IsAutoImplemented, GetterBody, SetterBody
CsGenerator Settings are: DefaultTabSize: 4 | OutputDirectory: "Output" |
-- List of components --
AccessModifier: public, private, protected, internal, protected_internal
BuiltInDataType: void, bool, byte, int, long, decimal, float, double, char, string, object
CommonDataType: DateTime, Guid
KeyWord: this, abstract, partial, static, new, virtual, override, sealed, const, async, readOnly
IndentType: None, Single, Double, Triple, Quadruple

For more complex code with indented segments specific Indent value should be set (prepend in a loop) for all internal lines/elements.

Package targets .NET Standard 2.0 so can be used both with .NetFramework and .NetCore / .Net (new unified)

Logo:

NuGet

Installation

Available on NuGet latest version.
Package manager console command for installation: Install-Package CsCodeGenerator

Support

If you find this project useful you can mark it by leaving a Github Star
If you want help development, you can become a CONTRIBUTOR or you can make a DONATION:
Buy Me A Coffee _ or _ Button
Want to Contact for Development & Consulting: www.codis.tech (Quality Assurance)

Contributing

Please read CONTRIBUTING for details on code of conduct, and the process for submitting pull requests.
When opening issues do write detailed explanation of the problem or feature with reproducible example.

**Also take a look into others packages:
Open source (MIT or cFOSS) authored .Net libraries (@Infopedia.io personal blog post)

.Net libraryDescription
1EFCore.BulkExtensionsEF Core Bulk CRUD Ops (Flagship Lib)
2EFCore.UtilExtensionsEF Core Custom Annotations and AuditInfo
3EFCore.FluentApiToAnnotationConverting FluentApi configuration to Annotations
4FixedWidthParserWriterReading & Writing fixed-width/flat data files
5*CsCodeGeneratorC# code generation based on Classes and elements
6CsCodeExampleExamples of C# code in form of a simple tutorial

GeneratorModel Structure:

Class Inheritance Hierarchy

|-*BaseElement
ClassModel :-----|Property:-- Field :----------|Constructor: Method :---------|EnumModel:------|InterfaceModel:-|

Component Composition

CsGenerator||---Files||---Enums||---Classes||---Fields||---Constructors(DefaultConstructorfirst)||---Attributes|||---Parameters||||---Parameters||---Properties||---Attributes|||---Parameters||||---Parameters||---Methods||---Attributes|||---Parameters||||---Parameters||---NestedClasses(recursively)|--- ...

How to use it

Following is first example of ComplexNumber class and then creating its ClassModel for writing to Complex.cs
There are 2 option to configure it:
-one is using Fluent methods (A)
-and other with pure classes and properties (B)

Class we want to generate:

usingSystem;usingSystem.Model;namespaceCsCodeGenerator.Tests{[Description("Some class info")]publicpartialclassComplexNumber:SomeBaseClass,NumbericInterface{protectedconstdoublePI=3.14;privatestringremark;publicComplexNumber(){}publicComplexNumber(doublereal,doubleimaginary=0){Real=real;Imaginary=imaginary;}publicstaticstringDefaultFormat{get;}="a + b * i";publicdoubleReal{get;set;}publicdoubleImaginary{get;set;}publicvirtualstringRemark{get{returnremark;}set{remark=value;}}publicdoubleModul(){returnMath.Sqrt(Real*Real+Imaginary*Imaginary);}publicComplexNumberAdd(ComplexNumberinput){ComplexNumberresult=newComplexNumber();result.Real=Real+input.Real;result.Imaginary=Imaginary+input.Imaginary;returnresult;}/// <summary>// example of 2 KeyWords(new and virtual), usually here would be just virtual/// <summary>publicnewvirtualstringToString(){return$"({Real:0.00}, {Imaginary:0.00})";}}}

A) Code to do it with Fluent methods - shorter code and more readable syntax. [WithElement() such as WithProperty]. Fluent calls are composed with BaseElement, when configuring deeper level we need to instanciate with New and call in the scope.
To be able to get subElements returned to main scope (like EFCore FluentAPI setting works) then more extension methods would be needed - one example is commented in source code: WithPropertyReturn.

varusingDirectives=newList<string>{"System;","System.ComponentModel;"};stringfileNameSpace="CsCodeGenerator.Tests";stringcomplexNumberText="ComplexNumber";// ClassvarclassModel=newClassModel();varindent=classModel.Indent;varcomplexNumberClass=(ClassModel)classModel.WithAttribute(newAttributeModel("Description").WithParameter(@"""Some class info""")).WithKeyWord(KeyWord.Partial).WithName(complexNumberText).WithConstructor(newConstructor(complexNumberText){BracesInNewLine=false}).WithConstructor(newConstructor(complexNumberText).WithParameter(BuiltInDataType.Double,"real",null).WithParameter(BuiltInDataType.Double,"imaginary","0").WithBodyLine("Real = real;").WithBodyLine("Imaginary = imaginary;")).WithField(newField(BuiltInDataType.Double,"PI"){SingleKeyWord=KeyWord.Const,DefaultValue="3.14"}).WithField(newField(BuiltInDataType.String,"remark"){AccessModifier=AccessModifier.Private}).WithProperty(newProperty(BuiltInDataType.String,"DefaultFormat"){SingleKeyWord=KeyWord.Static,IsGetOnly=true,DefaultValue=@"""a + b * i"""}).WithProperty(BuiltInDataType.Double,"Real").WithProperty(BuiltInDataType.Double,"Imaginary").WithProperty(newProperty(BuiltInDataType.String,"Remark"){SingleKeyWord=KeyWord.Virtual,IsAutoImplemented=false}.WithGetter("remark").WithSetter("remark = value")).WithMethod(newMethod(BuiltInDataType.Double,"Modul").WithBodyLine("return Math.Sqrt(Real * Real + Imaginary * Imaginary);")).WithMethod(newMethod(complexNumberText,"Add").WithParameter(complexNumberText,"input",null).WithBodyLine("ComplexNumber result = new ComplexNumber").WithBodyLine("{").AddIndent().WithBodyLine("Real = Real + input.Real,").WithBodyLine("Imaginary = Imaginary + input.Imaginary,").RemoveIndent().WithBodyLine("};").WithBodyLine("return result;")).WithMethod(newMethod(BuiltInDataType.String,"ToString"){KeyWords=[KeyWord.New,KeyWord.Virtual],Comment="example of 2 KeyWords(new and virtual), usually here would be just virtual"}.WithBodyLine("return $\"({Real:0.00}, {Imaginary:0.00})\";"));varcomplexNumberFile=newFileModel(complexNumberText);complexNumberFile.LoadUsingDirectives(usingDirectives);complexNumberFile.Namespace=fileNameSpace;complexNumberFile.Classes.Add(complexNumberClass);varcsGenerator=newCsGenerator();csGenerator.Files.Add(complexNumberFile);csGenerator.CreateFiles();

B) Alternative way without Fluent:

varusingDirectives=newList<string>{"using System;","using System.ComponentModel;"};stringfileNameSpace=$"{Util.Namespace} CsCodeGenerator.Tests";stringcomplexNumberText="ComplexNumber";ClassModelcomplexNumberClass=newClassModel(complexNumberText);complexNumberClass.SingleKeyWord=KeyWord.Partial;// one way to set single KeyWord//complexNumberClass.KeyWords.Add(KeyWord.Partial); // or alternative waycomplexNumberClass.BaseClass="SomeBaseClass";complexNumberClass.Interfaces.Add("NumbericInterface)";vardescriptionAttribute=newAttributeModel("Description"){SingleParameter=newParameter(@"""Some class info""")};complexNumberClass.AddAttribute(descriptionAttribute);complexNumberClass.DefaultConstructor.IsVisible=true;ConstructorsecondConstructor=newConstructor(complexNumberClass.Name);secondConstructor.Parameters.Add(newParameter(BuiltInDataType.Double,"real"));secondConstructor.Parameters.Add(newParameter(BuiltInDataType.Double,"imaginary"){Value="0"});secondConstructor.BodyLines.Add("Real = real;");secondConstructor.BodyLines.Add("Imaginary = imaginary;");complexNumberClass.Constructors.Add(secondConstructor);varfields=newField[]{newField(BuiltInDataType.Double,"PI"){SingleKeyWord=KeyWord.Const,DefaultValue="3.14"},newField(BuiltInDataType.String,"remark"){AccessModifier=AccessModifier.Private},}.ToDictionary(a =>a.Name, a =>a);varproperties=newProperty[]{newProperty(BuiltInDataType.String,"DefaultFormat"){SingleKeyWord=KeyWord.Static,IsGetOnly=true,DefaultValue=@"""a + b * i"""},newProperty(BuiltInDataType.Double,"Real"),newProperty(BuiltInDataType.Double,"Imaginary"),newProperty(BuiltInDataType.String,"Remark"){SingleKeyWord=KeyWord.Virtual,IsAutoImplemented=false,GetterBody="remark",SetterBody="remark = value"},}.ToDictionary(a =>a.Name, a =>a);varmethods=newMethod[]{newMethod(BuiltInDataType.Double,"Modul"){BodyLines=newList<string>{"return Math.Sqrt(Real * Real + Imaginary * Imaginary);"}},newMethod(complexNumberText,"Add"){Parameters=newList<Parameter>{newParameter("ComplexNumber","input",null)},BodyLines=newList<string>{"ComplexNumber result = new ComplexNumber();","result.Real = Real + input.Real;","result.Imaginary = Imaginary + input.Imaginary;","return result;"}},newMethod(BuiltInDataType.String,"ToString"){Comment="example of 2 KeyWords(new and virtual), usually here just virtual",KeyWords=newList<KeyWord>{KeyWord.New,KeyWord.Virtual},BodyLines=newList<string>{"return $\"({Real:0.00}, {Imaginary:0.00})\";"}}}.ToDictionary(a =>a.Name, a =>a);complexNumberClass.Fields=fields;complexNumberClass.Properties=properties;complexNumberClass.Methods=methods;FileModelcomplexNumberFile=newFileModel(complexNumberText);complexNumberFile.LoadUsingDirectives(usingDirectives);complexNumberFile.Namespace=fileNameSpace;complexNumberFile.Classes.Add(complexNumberClass.Name,complexNumberClass);CsGeneratorcsGenerator=newCsGenerator();csGenerator.Files.Add(complexNumberFile.Name,complexNumberFile);csGenerator.CreateFiles();//Console.Write(complexNumberFile); 

About

Easy C# class and code generation, POCO object and Methods creation

Topics

Resources

Code of conduct

Contributing

Stars

116 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CodeGenerator

This is a small .NET library that enables easy C# code generation based on Classes and its elements.
It has ability to create ClassModels (POCO object generator) and Methods and write it to .cs files.
Can specify their Members (Constructor, Field, Property, Method) including Attributes and Parameters.
Defining namespace and using Directives is supported as well.
Library can also generate Enums and Interfaces, and create NestedClasses inside parent class.

BaseElement has Config for: IndentSize, Comment, CommentHasSummaryTag(df:true), AccessModifier, BuiltInDataType, CustomDataType, Name
Property more Config: IsGetOnly, IsAutoImplemented, GetterBody, SetterBody
CsGenerator Settings are: DefaultTabSize: 4 | OutputDirectory: "Output" |
-- List of components --
AccessModifier: public, private, protected, internal, protected_internal
BuiltInDataType: void, bool, byte, int, long, decimal, float, double, char, string, object
CommonDataType: DateTime, Guid
KeyWord: this, abstract, partial, static, new, virtual, override, sealed, const, async, readOnly
IndentType: None, Single, Double, Triple, Quadruple

For more complex code with indented segments specific Indent value should be set (prepend in a loop) for all internal lines/elements.

Package targets .NET Standard 2.0 so can be used both with .NetFramework and .NetCore / .Net (new unified)

Logo:

NuGet

Installation

Available on NuGet latest version.
Package manager console command for installation: Install-Package CsCodeGenerator

Support

If you find this project useful you can mark it by leaving a Github Star
If you want help development, you can become a CONTRIBUTOR or you can make a DONATION:
Buy Me A Coffee _ or _ Button
Want to Contact for Development & Consulting: www.codis.tech (Quality Assurance)

Contributing

Please read CONTRIBUTING for details on code of conduct, and the process for submitting pull requests.
When opening issues do write detailed explanation of the problem or feature with reproducible example.

**Also take a look into others packages:
Open source (MIT or cFOSS) authored .Net libraries (@Infopedia.io personal blog post)

.Net libraryDescription
1EFCore.BulkExtensionsEF Core Bulk CRUD Ops (Flagship Lib)
2EFCore.UtilExtensionsEF Core Custom Annotations and AuditInfo
3EFCore.FluentApiToAnnotationConverting FluentApi configuration to Annotations
4FixedWidthParserWriterReading & Writing fixed-width/flat data files
5*CsCodeGeneratorC# code generation based on Classes and elements
6CsCodeExampleExamples of C# code in form of a simple tutorial

GeneratorModel Structure:

Class Inheritance Hierarchy

|-*BaseElement
ClassModel :-----|Property:-- Field :----------|Constructor: Method :---------|EnumModel:------|InterfaceModel:-|

Component Composition

CsGenerator||---Files||---Enums||---Classes||---Fields||---Constructors(DefaultConstructorfirst)||---Attributes|||---Parameters||||---Parameters||---Properties||---Attributes|||---Parameters||||---Parameters||---Methods||---Attributes|||---Parameters||||---Parameters||---NestedClasses(recursively)|--- ...

How to use it

Following is first example of ComplexNumber class and then creating its ClassModel for writing to Complex.cs
There are 2 option to configure it:
-one is using Fluent methods (A)
-and other with pure classes and properties (B)

Class we want to generate:

usingSystem;usingSystem.Model;namespaceCsCodeGenerator.Tests{[Description("Some class info")]publicpartialclassComplexNumber:SomeBaseClass,NumbericInterface{protectedconstdoublePI=3.14;privatestringremark;publicComplexNumber(){}publicComplexNumber(doublereal,doubleimaginary=0){Real=real;Imaginary=imaginary;}publicstaticstringDefaultFormat{get;}="a + b * i";publicdoubleReal{get;set;}publicdoubleImaginary{get;set;}publicvirtualstringRemark{get{returnremark;}set{remark=value;}}publicdoubleModul(){returnMath.Sqrt(Real*Real+Imaginary*Imaginary);}publicComplexNumberAdd(ComplexNumberinput){ComplexNumberresult=newComplexNumber();result.Real=Real+input.Real;result.Imaginary=Imaginary+input.Imaginary;returnresult;}/// <summary>// example of 2 KeyWords(new and virtual), usually here would be just virtual/// <summary>publicnewvirtualstringToString(){return$"({Real:0.00}, {Imaginary:0.00})";}}}

A) Code to do it with Fluent methods - shorter code and more readable syntax. [WithElement() such as WithProperty]. Fluent calls are composed with BaseElement, when configuring deeper level we need to instanciate with New and call in the scope.
To be able to get subElements returned to main scope (like EFCore FluentAPI setting works) then more extension methods would be needed - one example is commented in source code: WithPropertyReturn.

varusingDirectives=newList<string>{"System;","System.ComponentModel;"};stringfileNameSpace="CsCodeGenerator.Tests";stringcomplexNumberText="ComplexNumber";// ClassvarclassModel=newClassModel();varindent=classModel.Indent;varcomplexNumberClass=(ClassModel)classModel.WithAttribute(newAttributeModel("Description").WithParameter(@"""Some class info""")).WithKeyWord(KeyWord.Partial).WithName(complexNumberText).WithConstructor(newConstructor(complexNumberText){BracesInNewLine=false}).WithConstructor(newConstructor(complexNumberText).WithParameter(BuiltInDataType.Double,"real",null).WithParameter(BuiltInDataType.Double,"imaginary","0").WithBodyLine("Real = real;").WithBodyLine("Imaginary = imaginary;")).WithField(newField(BuiltInDataType.Double,"PI"){SingleKeyWord=KeyWord.Const,DefaultValue="3.14"}).WithField(newField(BuiltInDataType.String,"remark"){AccessModifier=AccessModifier.Private}).WithProperty(newProperty(BuiltInDataType.String,"DefaultFormat"){SingleKeyWord=KeyWord.Static,IsGetOnly=true,DefaultValue=@"""a + b * i"""}).WithProperty(BuiltInDataType.Double,"Real").WithProperty(BuiltInDataType.Double,"Imaginary").WithProperty(newProperty(BuiltInDataType.String,"Remark"){SingleKeyWord=KeyWord.Virtual,IsAutoImplemented=false}.WithGetter("remark").WithSetter("remark = value")).WithMethod(newMethod(BuiltInDataType.Double,"Modul").WithBodyLine("return Math.Sqrt(Real * Real + Imaginary * Imaginary);")).WithMethod(newMethod(complexNumberText,"Add").WithParameter(complexNumberText,"input",null).WithBodyLine("ComplexNumber result = new ComplexNumber").WithBodyLine("{").AddIndent().WithBodyLine("Real = Real + input.Real,").WithBodyLine("Imaginary = Imaginary + input.Imaginary,").RemoveIndent().WithBodyLine("};").WithBodyLine("return result;")).WithMethod(newMethod(BuiltInDataType.String,"ToString"){KeyWords=[KeyWord.New,KeyWord.Virtual],Comment="example of 2 KeyWords(new and virtual), usually here would be just virtual"}.WithBodyLine("return $\"({Real:0.00}, {Imaginary:0.00})\";"));varcomplexNumberFile=newFileModel(complexNumberText);complexNumberFile.LoadUsingDirectives(usingDirectives);complexNumberFile.Namespace=fileNameSpace;complexNumberFile.Classes.Add(complexNumberClass);varcsGenerator=newCsGenerator();csGenerator.Files.Add(complexNumberFile);csGenerator.CreateFiles();

B) Alternative way without Fluent:

varusingDirectives=newList<string>{"using System;","using System.ComponentModel;"};stringfileNameSpace=$"{Util.Namespace} CsCodeGenerator.Tests";stringcomplexNumberText="ComplexNumber";ClassModelcomplexNumberClass=newClassModel(complexNumberText);complexNumberClass.SingleKeyWord=KeyWord.Partial;// one way to set single KeyWord//complexNumberClass.KeyWords.Add(KeyWord.Partial); // or alternative waycomplexNumberClass.BaseClass="SomeBaseClass";complexNumberClass.Interfaces.Add("NumbericInterface)";vardescriptionAttribute=newAttributeModel("Description"){SingleParameter=newParameter(@"""Some class info""")};complexNumberClass.AddAttribute(descriptionAttribute);complexNumberClass.DefaultConstructor.IsVisible=true;ConstructorsecondConstructor=newConstructor(complexNumberClass.Name);secondConstructor.Parameters.Add(newParameter(BuiltInDataType.Double,"real"));secondConstructor.Parameters.Add(newParameter(BuiltInDataType.Double,"imaginary"){Value="0"});secondConstructor.BodyLines.Add("Real = real;");secondConstructor.BodyLines.Add("Imaginary = imaginary;");complexNumberClass.Constructors.Add(secondConstructor);varfields=newField[]{newField(BuiltInDataType.Double,"PI"){SingleKeyWord=KeyWord.Const,DefaultValue="3.14"},newField(BuiltInDataType.String,"remark"){AccessModifier=AccessModifier.Private},}.ToDictionary(a =>a.Name, a =>a);varproperties=newProperty[]{newProperty(BuiltInDataType.String,"DefaultFormat"){SingleKeyWord=KeyWord.Static,IsGetOnly=true,DefaultValue=@"""a + b * i"""},newProperty(BuiltInDataType.Double,"Real"),newProperty(BuiltInDataType.Double,"Imaginary"),newProperty(BuiltInDataType.String,"Remark"){SingleKeyWord=KeyWord.Virtual,IsAutoImplemented=false,GetterBody="remark",SetterBody="remark = value"},}.ToDictionary(a =>a.Name, a =>a);varmethods=newMethod[]{newMethod(BuiltInDataType.Double,"Modul"){BodyLines=newList<string>{"return Math.Sqrt(Real * Real + Imaginary * Imaginary);"}},newMethod(complexNumberText,"Add"){Parameters=newList<Parameter>{newParameter("ComplexNumber","input",null)},BodyLines=newList<string>{"ComplexNumber result = new ComplexNumber();","result.Real = Real + input.Real;","result.Imaginary = Imaginary + input.Imaginary;","return result;"}},newMethod(BuiltInDataType.String,"ToString"){Comment="example of 2 KeyWords(new and virtual), usually here just virtual",KeyWords=newList<KeyWord>{KeyWord.New,KeyWord.Virtual},BodyLines=newList<string>{"return $\"({Real:0.00}, {Imaginary:0.00})\";"}}}.ToDictionary(a =>a.Name, a =>a);complexNumberClass.Fields=fields;complexNumberClass.Properties=properties;complexNumberClass.Methods=methods;FileModelcomplexNumberFile=newFileModel(complexNumberText);complexNumberFile.LoadUsingDirectives(usingDirectives);complexNumberFile.Namespace=fileNameSpace;complexNumberFile.Classes.Add(complexNumberClass.Name,complexNumberClass);CsGeneratorcsGenerator=newCsGenerator();csGenerator.Files.Add(complexNumberFile.Name,complexNumberFile);csGenerator.CreateFiles();//Console.Write(complexNumberFile); 

About

Easy C# class and code generation, POCO object and Methods creation

Topics

Resources

Code of conduct

Contributing

Stars

116 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CodeGenerator

This is a small .NET library that enables easy C# code generation based on Classes and its elements.
It has ability to create ClassModels (POCO object generator) and Methods and write it to .cs files.
Can specify their Members (Constructor, Field, Property, Method) including Attributes and Parameters.
Defining namespace and using Directives is supported as well.
Library can also generate Enums and Interfaces, and create NestedClasses inside parent class.

BaseElement has Config for: IndentSize, Comment, CommentHasSummaryTag(df:true), AccessModifier, BuiltInDataType, CustomDataType, Name
Property more Config: IsGetOnly, IsAutoImplemented, GetterBody, SetterBody
CsGenerator Settings are: DefaultTabSize: 4 | OutputDirectory: "Output" |
-- List of components --
AccessModifier: public, private, protected, internal, protected_internal
BuiltInDataType: void, bool, byte, int, long, decimal, float, double, char, string, object
CommonDataType: DateTime, Guid
KeyWord: this, abstract, partial, static, new, virtual, override, sealed, const, async, readOnly
IndentType: None, Single, Double, Triple, Quadruple

For more complex code with indented segments specific Indent value should be set (prepend in a loop) for all internal lines/elements.

Package targets .NET Standard 2.0 so can be used both with .NetFramework and .NetCore / .Net (new unified)

Logo:

NuGet

Installation

Available on NuGet latest version.
Package manager console command for installation: Install-Package CsCodeGenerator

Support

If you find this project useful you can mark it by leaving a Github Star
If you want help development, you can become a CONTRIBUTOR or you can make a DONATION:
Buy Me A Coffee _ or _ Button
Want to Contact for Development & Consulting: www.codis.tech (Quality Assurance)

Contributing

Please read CONTRIBUTING for details on code of conduct, and the process for submitting pull requests.
When opening issues do write detailed explanation of the problem or feature with reproducible example.

**Also take a look into others packages:
Open source (MIT or cFOSS) authored .Net libraries (@Infopedia.io personal blog post)

.Net libraryDescription
1EFCore.BulkExtensionsEF Core Bulk CRUD Ops (Flagship Lib)
2EFCore.UtilExtensionsEF Core Custom Annotations and AuditInfo
3EFCore.FluentApiToAnnotationConverting FluentApi configuration to Annotations
4FixedWidthParserWriterReading & Writing fixed-width/flat data files
5*CsCodeGeneratorC# code generation based on Classes and elements
6CsCodeExampleExamples of C# code in form of a simple tutorial

GeneratorModel Structure:

Class Inheritance Hierarchy

|-*BaseElement
ClassModel :-----|Property:-- Field :----------|Constructor: Method :---------|EnumModel:------|InterfaceModel:-|

Component Composition

CsGenerator||---Files||---Enums||---Classes||---Fields||---Constructors(DefaultConstructorfirst)||---Attributes|||---Parameters||||---Parameters||---Properties||---Attributes|||---Parameters||||---Parameters||---Methods||---Attributes|||---Parameters||||---Parameters||---NestedClasses(recursively)|--- ...

How to use it

Following is first example of ComplexNumber class and then creating its ClassModel for writing to Complex.cs
There are 2 option to configure it:
-one is using Fluent methods (A)
-and other with pure classes and properties (B)

Class we want to generate:

usingSystem;usingSystem.Model;namespaceCsCodeGenerator.Tests{[Description("Some class info")]publicpartialclassComplexNumber:SomeBaseClass,NumbericInterface{protectedconstdoublePI=3.14;privatestringremark;publicComplexNumber(){}publicComplexNumber(doublereal,doubleimaginary=0){Real=real;Imaginary=imaginary;}publicstaticstringDefaultFormat{get;}="a + b * i";publicdoubleReal{get;set;}publicdoubleImaginary{get;set;}publicvirtualstringRemark{get{returnremark;}set{remark=value;}}publicdoubleModul(){returnMath.Sqrt(Real*Real+Imaginary*Imaginary);}publicComplexNumberAdd(ComplexNumberinput){ComplexNumberresult=newComplexNumber();result.Real=Real+input.Real;result.Imaginary=Imaginary+input.Imaginary;returnresult;}/// <summary>// example of 2 KeyWords(new and virtual), usually here would be just virtual/// <summary>publicnewvirtualstringToString(){return$"({Real:0.00}, {Imaginary:0.00})";}}}

A) Code to do it with Fluent methods - shorter code and more readable syntax. [WithElement() such as WithProperty]. Fluent calls are composed with BaseElement, when configuring deeper level we need to instanciate with New and call in the scope.
To be able to get subElements returned to main scope (like EFCore FluentAPI setting works) then more extension methods would be needed - one example is commented in source code: WithPropertyReturn.

varusingDirectives=newList<string>{"System;","System.ComponentModel;"};stringfileNameSpace="CsCodeGenerator.Tests";stringcomplexNumberText="ComplexNumber";// ClassvarclassModel=newClassModel();varindent=classModel.Indent;varcomplexNumberClass=(ClassModel)classModel.WithAttribute(newAttributeModel("Description").WithParameter(@"""Some class info""")).WithKeyWord(KeyWord.Partial).WithName(complexNumberText).WithConstructor(newConstructor(complexNumberText){BracesInNewLine=false}).WithConstructor(newConstructor(complexNumberText).WithParameter(BuiltInDataType.Double,"real",null).WithParameter(BuiltInDataType.Double,"imaginary","0").WithBodyLine("Real = real;").WithBodyLine("Imaginary = imaginary;")).WithField(newField(BuiltInDataType.Double,"PI"){SingleKeyWord=KeyWord.Const,DefaultValue="3.14"}).WithField(newField(BuiltInDataType.String,"remark"){AccessModifier=AccessModifier.Private}).WithProperty(newProperty(BuiltInDataType.String,"DefaultFormat"){SingleKeyWord=KeyWord.Static,IsGetOnly=true,DefaultValue=@"""a + b * i"""}).WithProperty(BuiltInDataType.Double,"Real").WithProperty(BuiltInDataType.Double,"Imaginary").WithProperty(newProperty(BuiltInDataType.String,"Remark"){SingleKeyWord=KeyWord.Virtual,IsAutoImplemented=false}.WithGetter("remark").WithSetter("remark = value")).WithMethod(newMethod(BuiltInDataType.Double,"Modul").WithBodyLine("return Math.Sqrt(Real * Real + Imaginary * Imaginary);")).WithMethod(newMethod(complexNumberText,"Add").WithParameter(complexNumberText,"input",null).WithBodyLine("ComplexNumber result = new ComplexNumber").WithBodyLine("{").AddIndent().WithBodyLine("Real = Real + input.Real,").WithBodyLine("Imaginary = Imaginary + input.Imaginary,").RemoveIndent().WithBodyLine("};").WithBodyLine("return result;")).WithMethod(newMethod(BuiltInDataType.String,"ToString"){KeyWords=[KeyWord.New,KeyWord.Virtual],Comment="example of 2 KeyWords(new and virtual), usually here would be just virtual"}.WithBodyLine("return $\"({Real:0.00}, {Imaginary:0.00})\";"));varcomplexNumberFile=newFileModel(complexNumberText);complexNumberFile.LoadUsingDirectives(usingDirectives);complexNumberFile.Namespace=fileNameSpace;complexNumberFile.Classes.Add(complexNumberClass);varcsGenerator=newCsGenerator();csGenerator.Files.Add(complexNumberFile);csGenerator.CreateFiles();

B) Alternative way without Fluent:

varusingDirectives=newList<string>{"using System;","using System.ComponentModel;"};stringfileNameSpace=$"{Util.Namespace} CsCodeGenerator.Tests";stringcomplexNumberText="ComplexNumber";ClassModelcomplexNumberClass=newClassModel(complexNumberText);complexNumberClass.SingleKeyWord=KeyWord.Partial;// one way to set single KeyWord//complexNumberClass.KeyWords.Add(KeyWord.Partial); // or alternative waycomplexNumberClass.BaseClass="SomeBaseClass";complexNumberClass.Interfaces.Add("NumbericInterface)";vardescriptionAttribute=newAttributeModel("Description"){SingleParameter=newParameter(@"""Some class info""")};complexNumberClass.AddAttribute(descriptionAttribute);complexNumberClass.DefaultConstructor.IsVisible=true;ConstructorsecondConstructor=newConstructor(complexNumberClass.Name);secondConstructor.Parameters.Add(newParameter(BuiltInDataType.Double,"real"));secondConstructor.Parameters.Add(newParameter(BuiltInDataType.Double,"imaginary"){Value="0"});secondConstructor.BodyLines.Add("Real = real;");secondConstructor.BodyLines.Add("Imaginary = imaginary;");complexNumberClass.Constructors.Add(secondConstructor);varfields=newField[]{newField(BuiltInDataType.Double,"PI"){SingleKeyWord=KeyWord.Const,DefaultValue="3.14"},newField(BuiltInDataType.String,"remark"){AccessModifier=AccessModifier.Private},}.ToDictionary(a =>a.Name, a =>a);varproperties=newProperty[]{newProperty(BuiltInDataType.String,"DefaultFormat"){SingleKeyWord=KeyWord.Static,IsGetOnly=true,DefaultValue=@"""a + b * i"""},newProperty(BuiltInDataType.Double,"Real"),newProperty(BuiltInDataType.Double,"Imaginary"),newProperty(BuiltInDataType.String,"Remark"){SingleKeyWord=KeyWord.Virtual,IsAutoImplemented=false,GetterBody="remark",SetterBody="remark = value"},}.ToDictionary(a =>a.Name, a =>a);varmethods=newMethod[]{newMethod(BuiltInDataType.Double,"Modul"){BodyLines=newList<string>{"return Math.Sqrt(Real * Real + Imaginary * Imaginary);"}},newMethod(complexNumberText,"Add"){Parameters=newList<Parameter>{newParameter("ComplexNumber","input",null)},BodyLines=newList<string>{"ComplexNumber result = new ComplexNumber();","result.Real = Real + input.Real;","result.Imaginary = Imaginary + input.Imaginary;","return result;"}},newMethod(BuiltInDataType.String,"ToString"){Comment="example of 2 KeyWords(new and virtual), usually here just virtual",KeyWords=newList<KeyWord>{KeyWord.New,KeyWord.Virtual},BodyLines=newList<string>{"return $\"({Real:0.00}, {Imaginary:0.00})\";"}}}.ToDictionary(a =>a.Name, a =>a);complexNumberClass.Fields=fields;complexNumberClass.Properties=properties;complexNumberClass.Methods=methods;FileModelcomplexNumberFile=newFileModel(complexNumberText);complexNumberFile.LoadUsingDirectives(usingDirectives);complexNumberFile.Namespace=fileNameSpace;complexNumberFile.Classes.Add(complexNumberClass.Name,complexNumberClass);CsGeneratorcsGenerator=newCsGenerator();csGenerator.Files.Add(complexNumberFile.Name,complexNumberFile);csGenerator.CreateFiles();//Console.Write(complexNumberFile); 

About

Easy C# class and code generation, POCO object and Methods creation

Topics

Resources

Code of conduct

Contributing

Stars

116 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

CodeGenerator

This is a small .NET library that enables easy C# code generation based on Classes and its elements.
It has ability to create ClassModels (POCO object generator) and Methods and write it to .cs files.
Can specify their Members (Constructor, Field, Property, Method) including Attributes and Parameters.
Defining namespace and using Directives is supported as well.
Library can also generate Enums and Interfaces, and create NestedClasses inside parent class.

BaseElement has Config for: IndentSize, Comment, CommentHasSummaryTag(df:true), AccessModifier, BuiltInDataType, CustomDataType, Name
Property more Config: IsGetOnly, IsAutoImplemented, GetterBody, SetterBody
CsGenerator Settings are: DefaultTabSize: 4 | OutputDirectory: "Output" |
-- List of components --
AccessModifier: public, private, protected, internal, protected_internal
BuiltInDataType: void, bool, byte, int, long, decimal, float, double, char, string, object
CommonDataType: DateTime, Guid
KeyWord: this, abstract, partial, static, new, virtual, override, sealed, const, async, readOnly
IndentType: None, Single, Double, Triple, Quadruple

For more complex code with indented segments specific Indent value should be set (prepend in a loop) for all internal lines/elements.

Package targets .NET Standard 2.0 so can be used both with .NetFramework and .NetCore / .Net (new unified)

Logo:

NuGet

Installation

Available on NuGet latest version.
Package manager console command for installation: Install-Package CsCodeGenerator

Support

If you find this project useful you can mark it by leaving a Github Star
If you want help development, you can become a CONTRIBUTOR or you can make a DONATION:
Buy Me A Coffee _ or _ Button
Want to Contact for Development & Consulting: www.codis.tech (Quality Assurance)

Contributing

Please read CONTRIBUTING for details on code of conduct, and the process for submitting pull requests.
When opening issues do write detailed explanation of the problem or feature with reproducible example.

**Also take a look into others packages:
Open source (MIT or cFOSS) authored .Net libraries (@Infopedia.io personal blog post)

.Net libraryDescription
1EFCore.BulkExtensionsEF Core Bulk CRUD Ops (Flagship Lib)
2EFCore.UtilExtensionsEF Core Custom Annotations and AuditInfo
3EFCore.FluentApiToAnnotationConverting FluentApi configuration to Annotations
4FixedWidthParserWriterReading & Writing fixed-width/flat data files
5*CsCodeGeneratorC# code generation based on Classes and elements
6CsCodeExampleExamples of C# code in form of a simple tutorial

GeneratorModel Structure:

Class Inheritance Hierarchy

|-*BaseElement
ClassModel :-----|Property:-- Field :----------|Constructor: Method :---------|EnumModel:------|InterfaceModel:-|

Component Composition

CsGenerator||---Files||---Enums||---Classes||---Fields||---Constructors(DefaultConstructorfirst)||---Attributes|||---Parameters||||---Parameters||---Properties||---Attributes|||---Parameters||||---Parameters||---Methods||---Attributes|||---Parameters||||---Parameters||---NestedClasses(recursively)|--- ...

How to use it

Following is first example of ComplexNumber class and then creating its ClassModel for writing to Complex.cs
There are 2 option to configure it:
-one is using Fluent methods (A)
-and other with pure classes and properties (B)

Class we want to generate:

usingSystem;usingSystem.Model;namespaceCsCodeGenerator.Tests{[Description("Some class info")]publicpartialclassComplexNumber:SomeBaseClass,NumbericInterface{protectedconstdoublePI=3.14;privatestringremark;publicComplexNumber(){}publicComplexNumber(doublereal,doubleimaginary=0){Real=real;Imaginary=imaginary;}publicstaticstringDefaultFormat{get;}="a + b * i";publicdoubleReal{get;set;}publicdoubleImaginary{get;set;}publicvirtualstringRemark{get{returnremark;}set{remark=value;}}publicdoubleModul(){returnMath.Sqrt(Real*Real+Imaginary*Imaginary);}publicComplexNumberAdd(ComplexNumberinput){ComplexNumberresult=newComplexNumber();result.Real=Real+input.Real;result.Imaginary=Imaginary+input.Imaginary;returnresult;}/// <summary>// example of 2 KeyWords(new and virtual), usually here would be just virtual/// <summary>publicnewvirtualstringToString(){return$"({Real:0.00}, {Imaginary:0.00})";}}}

A) Code to do it with Fluent methods - shorter code and more readable syntax. [WithElement() such as WithProperty]. Fluent calls are composed with BaseElement, when configuring deeper level we need to instanciate with New and call in the scope.
To be able to get subElements returned to main scope (like EFCore FluentAPI setting works) then more extension methods would be needed - one example is commented in source code: WithPropertyReturn.

varusingDirectives=newList<string>{"System;","System.ComponentModel;"};stringfileNameSpace="CsCodeGenerator.Tests";stringcomplexNumberText="ComplexNumber";// ClassvarclassModel=newClassModel();varindent=classModel.Indent;varcomplexNumberClass=(ClassModel)classModel.WithAttribute(newAttributeModel("Description").WithParameter(@"""Some class info""")).WithKeyWord(KeyWord.Partial).WithName(complexNumberText).WithConstructor(newConstructor(complexNumberText){BracesInNewLine=false}).WithConstructor(newConstructor(complexNumberText).WithParameter(BuiltInDataType.Double,"real",null).WithParameter(BuiltInDataType.Double,"imaginary","0").WithBodyLine("Real = real;").WithBodyLine("Imaginary = imaginary;")).WithField(newField(BuiltInDataType.Double,"PI"){SingleKeyWord=KeyWord.Const,DefaultValue="3.14"}).WithField(newField(BuiltInDataType.String,"remark"){AccessModifier=AccessModifier.Private}).WithProperty(newProperty(BuiltInDataType.String,"DefaultFormat"){SingleKeyWord=KeyWord.Static,IsGetOnly=true,DefaultValue=@"""a + b * i"""}).WithProperty(BuiltInDataType.Double,"Real").WithProperty(BuiltInDataType.Double,"Imaginary").WithProperty(newProperty(BuiltInDataType.String,"Remark"){SingleKeyWord=KeyWord.Virtual,IsAutoImplemented=false}.WithGetter("remark").WithSetter("remark = value")).WithMethod(newMethod(BuiltInDataType.Double,"Modul").WithBodyLine("return Math.Sqrt(Real * Real + Imaginary * Imaginary);")).WithMethod(newMethod(complexNumberText,"Add").WithParameter(complexNumberText,"input",null).WithBodyLine("ComplexNumber result = new ComplexNumber").WithBodyLine("{").AddIndent().WithBodyLine("Real = Real + input.Real,").WithBodyLine("Imaginary = Imaginary + input.Imaginary,").RemoveIndent().WithBodyLine("};").WithBodyLine("return result;")).WithMethod(newMethod(BuiltInDataType.String,"ToString"){KeyWords=[KeyWord.New,KeyWord.Virtual],Comment="example of 2 KeyWords(new and virtual), usually here would be just virtual"}.WithBodyLine("return $\"({Real:0.00}, {Imaginary:0.00})\";"));varcomplexNumberFile=newFileModel(complexNumberText);complexNumberFile.LoadUsingDirectives(usingDirectives);complexNumberFile.Namespace=fileNameSpace;complexNumberFile.Classes.Add(complexNumberClass);varcsGenerator=newCsGenerator();csGenerator.Files.Add(complexNumberFile);csGenerator.CreateFiles();

B) Alternative way without Fluent:

varusingDirectives=newList<string>{"using System;","using System.ComponentModel;"};stringfileNameSpace=$"{Util.Namespace} CsCodeGenerator.Tests";stringcomplexNumberText="ComplexNumber";ClassModelcomplexNumberClass=newClassModel(complexNumberText);complexNumberClass.SingleKeyWord=KeyWord.Partial;// one way to set single KeyWord//complexNumberClass.KeyWords.Add(KeyWord.Partial); // or alternative waycomplexNumberClass.BaseClass="SomeBaseClass";complexNumberClass.Interfaces.Add("NumbericInterface)";vardescriptionAttribute=newAttributeModel("Description"){SingleParameter=newParameter(@"""Some class info""")};complexNumberClass.AddAttribute(descriptionAttribute);complexNumberClass.DefaultConstructor.IsVisible=true;ConstructorsecondConstructor=newConstructor(complexNumberClass.Name);secondConstructor.Parameters.Add(newParameter(BuiltInDataType.Double,"real"));secondConstructor.Parameters.Add(newParameter(BuiltInDataType.Double,"imaginary"){Value="0"});secondConstructor.BodyLines.Add("Real = real;");secondConstructor.BodyLines.Add("Imaginary = imaginary;");complexNumberClass.Constructors.Add(secondConstructor);varfields=newField[]{newField(BuiltInDataType.Double,"PI"){SingleKeyWord=KeyWord.Const,DefaultValue="3.14"},newField(BuiltInDataType.String,"remark"){AccessModifier=AccessModifier.Private},}.ToDictionary(a =>a.Name, a =>a);varproperties=newProperty[]{newProperty(BuiltInDataType.String,"DefaultFormat"){SingleKeyWord=KeyWord.Static,IsGetOnly=true,DefaultValue=@"""a + b * i"""},newProperty(BuiltInDataType.Double,"Real"),newProperty(BuiltInDataType.Double,"Imaginary"),newProperty(BuiltInDataType.String,"Remark"){SingleKeyWord=KeyWord.Virtual,IsAutoImplemented=false,GetterBody="remark",SetterBody="remark = value"},}.ToDictionary(a =>a.Name, a =>a);varmethods=newMethod[]{newMethod(BuiltInDataType.Double,"Modul"){BodyLines=newList<string>{"return Math.Sqrt(Real * Real + Imaginary * Imaginary);"}},newMethod(complexNumberText,"Add"){Parameters=newList<Parameter>{newParameter("ComplexNumber","input",null)},BodyLines=newList<string>{"ComplexNumber result = new ComplexNumber();","result.Real = Real + input.Real;","result.Imaginary = Imaginary + input.Imaginary;","return result;"}},newMethod(BuiltInDataType.String,"ToString"){Comment="example of 2 KeyWords(new and virtual), usually here just virtual",KeyWords=newList<KeyWord>{KeyWord.New,KeyWord.Virtual},BodyLines=newList<string>{"return $\"({Real:0.00}, {Imaginary:0.00})\";"}}}.ToDictionary(a =>a.Name, a =>a);complexNumberClass.Fields=fields;complexNumberClass.Properties=properties;complexNumberClass.Methods=methods;FileModelcomplexNumberFile=newFileModel(complexNumberText);complexNumberFile.LoadUsingDirectives(usingDirectives);complexNumberFile.Namespace=fileNameSpace;complexNumberFile.Classes.Add(complexNumberClass.Name,complexNumberClass);CsGeneratorcsGenerator=newCsGenerator();csGenerator.Files.Add(complexNumberFile.Name,complexNumberFile);csGenerator.CreateFiles();//Console.Write(complexNumberFile); 

About

Easy C# class and code generation, POCO object and Methods creation

Topics

Resources

Code of conduct

Contributing

Stars

116 stars

Watchers

6 watching

Forks

Releases

Packages

Used by

Contributors

Languages