Repository: asyncapi/modelina
Pull request #316 (2021-08-09 16:16:21)

feat: added C# class and enum generator
**Description**
This PR adds C# class and enum generator alongside tests.

sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; ![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316) No Coverage information  
[![1.6%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '1.6%')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list) [1.6% Duplication](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list)


coveralls: ## Pull Request Test Coverage Report for [Build 1113541175](https://coveralls.io/builds/42006444)

* **140** of **145**   **(96.55%)**  changed or added relevant lines in **8** files are covered.
* No unchanged relevant lines lost coverage.
* Overall coverage decreased (**-0.3%**) to **93.536%**

---

|  Changes Missing Coverage | Covered Lines | Changed/Added Lines | % |
| :-----|--------------|--------|---: |
| [src/generators/csharp/CSharpGenerator.ts](https://coveralls.io/builds/42006444/source?filename=src%2Fgenerators%2Fcsharp%2FCSharpGenerator.ts#L41) | 21 | 22 | 95.45%
| [src/generators/csharp/CSharpRenderer.ts](https://coveralls.io/builds/42006444/source?filename=src%2Fgenerators%2Fcsharp%2FCSharpRenderer.ts#L50) | 25 | 29 | 86.21%
<!-- | **Total:** | **140** | **145** | **96.55%** | -->


|  Totals | [![Coverage Status](https://coveralls.io/builds/42006444/badge)](https://coveralls.io/builds/42006444) |
| :-- | --: |
| Change from base [Build 1075213008](https://coveralls.io/builds/41720327): |  -0.3% |
| Covered Lines: | 1650 |
| Relevant Lines: | 1684 |

---
##### 💛  - [Coveralls](https://coveralls.io)

sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; ![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316) No Coverage information  
[![1.6%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '1.6%')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list) [1.6% Duplication](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; ![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316) No Coverage information  
[![1.2%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '1.2%')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list) [1.2% Duplication](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; ![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316) No Coverage information  
[![1.2%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '1.2%')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list) [1.2% Duplication](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; ![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316) No Coverage information  
[![1.2%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '1.2%')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list) [1.2% Duplication](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; ![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316) No Coverage information  
[![1.2%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '1.2%')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list) [1.2% Duplication](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; ![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316) No Coverage information  
[![1.2%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '1.2%')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list) [1.2% Duplication](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; ![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316) No Coverage information  
[![1.2%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '1.2%')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list) [1.2% Duplication](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; ![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316) No Coverage information  
[![1.2%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '1.2%')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list) [1.2% Duplication](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; ![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316) No Coverage information  
[![1.2%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '1.2%')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list) [1.2% Duplication](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; ![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316) No Coverage information  
[![0.8%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.8%')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list) [0.8% Duplication](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; ![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316) No Coverage information  
[![1.2%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '1.2%')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list) [1.2% Duplication](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; ![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=asyncapi_generator-model-sdk&pullRequest=316&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316) No Coverage information  
[![1.2%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '1.2%')](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list) [1.2% Duplication](https://sonarcloud.io/component_measures?id=asyncapi_generator-model-sdk&pullRequest=316&metric=new_duplicated_lines_density&view=list)


jonaslagoni: Thanks 🎉 

Patch:
diff --git a/Dockerfile b/Dockerfile
index 683be21c..47400dbb 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,11 +1,25 @@
 FROM openjdk:16.0.1-jdk-slim-buster
+
+# Install updates
 RUN apt-get update -yq \
-    && apt-get install -yq curl \
-    && curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - \
-    && apt-get install -yq nodejs \
-    && curl -fsSL https://golang.org/dl/go1.16.5.linux-amd64.tar.gz | tar -C /usr/local -xz
+    && apt-get install -yq curl
+
+# Install nodejs
+RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - \
+    && apt-get install -yq nodejs 
+
+# Install golang
+RUN curl -fsSL https://golang.org/dl/go1.16.5.linux-amd64.tar.gz | tar -C /usr/local -xz
 ENV PATH="${PATH}:/usr/local/go/bin"
 
+# Install dotnet SDK
+RUN apt install apt-transport-https dirmngr gnupg ca-certificates -yq  \
+    && apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF \
+    && echo "deb https://download.mono-project.com/repo/debian stable-buster main" | tee /etc/apt/sources.list.d/mono-official-stable.list \
+    && apt update -yq  \
+    && apt install mono-devel -yq 
+
+# Setup library 
 COPY package-lock.json .
 RUN npm install
 COPY . .
\ No newline at end of file
diff --git a/docs/development.md b/docs/development.md
index a555a5b7..af511cb4 100644
--- a/docs/development.md
+++ b/docs/development.md
@@ -25,5 +25,6 @@ If you prefer to install all the dependencies locally, keep reading.
 The blackbox testing have some different requirements in order to successfully run:
 - To to run the `java` blackbox tests, you need to have JDK installed.
 - To to run the `ts` blackbox tests, you need to have TypeScript installed globally - `npm install -g typescript`.
+- To to run the `C#` blackbox tests, you need to have C# compiler installed globally. - https://www.mono-project.com/download/stable/
 
 By default the blackbox tests are not run with the regular `npm run test`, but can be run with `npm run test:blackbox`.
diff --git a/docs/generators.md b/docs/generators.md
index 7ff3112a..6d374c50 100644
--- a/docs/generators.md
+++ b/docs/generators.md
@@ -8,6 +8,7 @@
 - [TypeScript](../src/generators/typescript/TypeScriptGenerator.ts),
 - [Java](../src/generators/java/JavaGenerator.ts).
 - [Go](../src/generators/go/GoGenerator.ts).
+- [C#](../src/generators/csharp/CSharpGenerator.ts).
 
 ## Generator's options
 
@@ -66,6 +67,14 @@ Below is a list of additional options available for a given generator.
 | `namingConvention.type` | Function | A function that returns the format of the type. | _Returns pascal cased name_ |
 | `namingConvention.field` | Function | A function that returns the format of the field. | _Returns pascal cased name_ |
 
+### [C#](../src/generators/csharp/CSharpGenerator.ts)
+
+| Option | Type | Description | Default value |
+|---|---|---|---|$
+| `namingConvention` | Object | Options for naming conventions. | - |
+| `namingConvention.type` | Function | A function that returns the format of the type. | _Returns pascal cased name, and ensures that reserved keywords are never rendered__ |
+| `namingConvention.property` | Function | A function that returns the format of the property. | _Returns camel cased name, and ensures that names of properties does not clash against reserved keywords_ |
+
 ## Custom generator
 
 The minimum set of required actions to create a new generator are:
diff --git a/docs/presets.md b/docs/presets.md
index c3d91363..14cac3e4 100644
--- a/docs/presets.md
+++ b/docs/presets.md
@@ -201,3 +201,21 @@ There are no additional methods.
 | Method | Description | Additional arguments |
 |---|---|---|
 | `field` | A method to extend rendered given field. | `fieldName` as a name of a given field, `field` object as a [`CommonModel`](../src/models/CommonModel.ts) instance. |
+
+
+### C#
+
+#### **Class**
+
+| Method | Description | Additional arguments |
+|---|---|---|
+| `ctor` | A method to extend rendered constructor for a given class. | - |
+| `property` | A method to extend rendered given property. | `propertyName` as a name of a given property, `property` object as a [`CommonModel`](../src/models/CommonModel.ts) instance. |
+| `setter` | A method to extend setter for a given property. | `propertyName` as a name of a given property, `property` object as a [`CommonModel`](../src/models/CommonModel.ts) instance. |
+| `getter` | A method to extend getter for a given property. | `propertyName` as a name of a given property, `property` object as a [`CommonModel`](../src/models/CommonModel.ts) instance. |
+
+#### **Enum**
+
+| Method | Description | Additional arguments |
+|---|---|---|
+| `item` | A method to extend enum's item. | an `item` containing the value of enum's item. |
diff --git a/package.json b/package.json
index 9f405909..1379b8eb 100644
--- a/package.json
+++ b/package.json
@@ -63,7 +63,7 @@
     "build:cjs": "tsc",
     "build:esm": "tsc --project tsconfig.json --module ESNext --outDir ./lib/esm",
     "build:types": "tsc --project tsconfig.json --declaration --emitDeclarationOnly --declarationMap --outDir ./lib/types",
-    "docker:build": "docker build -q -t asyncapi/modelina .",
+    "docker:build": "docker build -t asyncapi/modelina .",
     "docker:test": "npm run docker:build && docker run asyncapi/modelina npm run test",
     "docker:test:blackbox": "npm run docker:build && docker run asyncapi/modelina npm run test:blackbox",
     "test": "cross-env CI=true jest --coverage --testPathIgnorePatterns ./test/blackbox",
diff --git a/src/generators/csharp/CSharpGenerator.ts b/src/generators/csharp/CSharpGenerator.ts
new file mode 100644
index 00000000..661519bb
--- /dev/null
+++ b/src/generators/csharp/CSharpGenerator.ts
@@ -0,0 +1,57 @@
+import {
+  AbstractGenerator,
+  CommonGeneratorOptions,
+  defaultGeneratorOptions,
+} from '../AbstractGenerator';
+import { CommonModel, CommonInputModel, RenderOutput } from '../../models';
+import { TypeHelpers, ModelKind, CommonNamingConvention, CommonNamingConventionImplementation } from '../../helpers';
+import { CSharpPreset, CSHARP_DEFAULT_PRESET } from './CSharpPreset';
+import { EnumRenderer } from './renderers/EnumRenderer';
+import { ClassRenderer } from './renderers/ClassRenderer';
+
+export interface CSharpOptions extends CommonGeneratorOptions<CSharpPreset> {
+  namingConvention?: CommonNamingConvention;
+}
+
+/**
+ * Generator for CSharp
+ */
+export class CSharpGenerator extends AbstractGenerator<CSharpOptions> {
+  static defaultOptions: CSharpOptions = {
+    ...defaultGeneratorOptions,
+    defaultPreset: CSHARP_DEFAULT_PRESET,
+    namingConvention: CommonNamingConventionImplementation
+  };
+
+  constructor(
+    options: CSharpOptions = CSharpGenerator.defaultOptions,
+  ) {
+    super('CSharp', CSharpGenerator.defaultOptions, options);
+  }
+
+  render(model: CommonModel, inputModel: CommonInputModel): Promise<RenderOutput> {
+    const kind = TypeHelpers.extractKind(model);
+    switch (kind) {
+    case ModelKind.OBJECT: 
+      return this.renderClass(model, inputModel);
+    case ModelKind.ENUM: 
+      return this.renderEnum(model, inputModel);
+    }
+
+    return Promise.resolve(RenderOutput.toRenderOutput({ result: '', dependencies: [] }));
+  }
+
+  async renderEnum(model: CommonModel, inputModel: CommonInputModel): Promise<RenderOutput> {
+    const presets = this.getPresets('enum');
+    const renderer = new EnumRenderer(this.options, this, presets, model, inputModel);
+    const result = await renderer.runSelfPreset();
+    return RenderOutput.toRenderOutput({ result, dependencies: renderer.dependencies });
+  }
+
+  async renderClass(model: CommonModel, inputModel: CommonInputModel): Promise<RenderOutput> {
+    const presets = this.getPresets('class');
+    const renderer = new ClassRenderer(this.options, this, presets, model, inputModel);
+    const result = await renderer.runSelfPreset();
+    return RenderOutput.toRenderOutput({ result, dependencies: renderer.dependencies });
+  }
+}
diff --git a/src/generators/csharp/CSharpPreset.ts b/src/generators/csharp/CSharpPreset.ts
new file mode 100644
index 00000000..2e0c340b
--- /dev/null
+++ b/src/generators/csharp/CSharpPreset.ts
@@ -0,0 +1,14 @@
+/* eslint-disable @typescript-eslint/ban-types */
+import { Preset, EnumPreset, ClassPreset } from '../../models';
+import { ClassRenderer, CSHARP_DEFAULT_CLASS_PRESET } from './renderers/ClassRenderer';
+import { CSHARP_DEFAULT_ENUM_PRESET, EnumRenderer } from './renderers/EnumRenderer';
+
+export type CSharpPreset = Preset<{
+  class: ClassPreset<ClassRenderer>;
+  enum: EnumPreset<EnumRenderer>
+}>;
+
+export const CSHARP_DEFAULT_PRESET: CSharpPreset = {
+  class: CSHARP_DEFAULT_CLASS_PRESET,
+  enum: CSHARP_DEFAULT_ENUM_PRESET,
+};
diff --git a/src/generators/csharp/CSharpRenderer.ts b/src/generators/csharp/CSharpRenderer.ts
new file mode 100644
index 00000000..4fd0bda4
--- /dev/null
+++ b/src/generators/csharp/CSharpRenderer.ts
@@ -0,0 +1,96 @@
+import { AbstractRenderer } from '../AbstractRenderer';
+import { CSharpGenerator, CSharpOptions } from './CSharpGenerator';
+import { CommonModel, CommonInputModel, Preset, PropertyType } from '../../models';
+import { FormatHelpers } from '../../helpers/FormatHelpers';
+import { isReservedCSharpKeyword } from './Constants';
+
+/**
+ * Common renderer for CSharp types
+ * 
+ * @extends AbstractRenderer
+ */
+export abstract class CSharpRenderer extends AbstractRenderer<CSharpOptions> {
+  constructor(
+    options: CSharpOptions,
+    generator: CSharpGenerator,
+    presets: Array<[Preset, unknown]>,
+    model: CommonModel,
+    inputModel: CommonInputModel,
+  ) {
+    super(options, generator, presets, model, inputModel);
+  }
+
+  /**
+   * Renders the name of a type based on provided generator option naming convention type function.
+   * 
+   * This is used to render names of models and then later used if that class is referenced from other models.
+   * 
+   * @param name 
+   * @param model 
+   */
+  nameType(name: string | undefined, model?: CommonModel): string {
+    return this.options?.namingConvention?.type 
+      ? this.options.namingConvention.type(name, { model: model || this.model, inputModel: this.inputModel, isReservedKeyword: isReservedCSharpKeyword(`${name}`) })
+      : name || '';
+  }
+
+  /**
+   * Renders the name of a property based on provided generator option naming convention property function.
+   * 
+   * @param propertyName 
+   * @param property
+   */
+  nameProperty(propertyName: string | undefined, property?: CommonModel): string {
+    return this.options?.namingConvention?.property 
+      ? this.options.namingConvention.property(propertyName, { model: this.model, inputModel: this.inputModel, property, isReservedKeyword: isReservedCSharpKeyword(`${propertyName}`) })
+      : propertyName || '';
+  }
+
+  runPropertyPreset(propertyName: string, property: CommonModel, type: PropertyType = PropertyType.property): Promise<string> {
+    return this.runPreset('property', { propertyName, property, type });
+  }
+
+  renderType(model: CommonModel): string {
+    if (model.$ref !== undefined) {
+      return this.nameType(model.$ref);
+    }
+
+    if (Array.isArray(model.type)) {
+      return model.type.length > 1 ? 'dynamic' : `${this.toCSharpType(model.type[0], model)}`;
+    }
+
+    return this.toCSharpType(model.type, model);
+  }
+
+  renderComments(lines: string | string[]): string {
+    lines = FormatHelpers.breakLines(lines);
+    return lines.map(line => `// ${line}`).join('\n');
+  }
+
+  toCSharpType(type: string | undefined, model: CommonModel): string {
+    if (type === undefined) {
+      return 'dynamic';
+    }
+
+    switch (type) {
+    case 'string':
+      return 'string';
+    case 'integer':
+      return 'int';
+    case 'number':
+      return 'float';
+    case 'boolean':
+      return 'bool';
+    case 'object':
+      return 'object';
+    case 'array': {
+      if (Array.isArray(model.items)) {
+        return model.items.length > 1? 'dynamic[]' : `${this.renderType(model.items[0])}[]`;
+      }
+      const arrayType = model.items ? this.renderType(model.items) : 'dynamic';
+      return `${arrayType}[]`;
+    }
+    default: return type;
+    }
+  }
+}
diff --git a/src/generators/csharp/Constants.ts b/src/generators/csharp/Constants.ts
new file mode 100644
index 00000000..8959d7ab
--- /dev/null
+++ b/src/generators/csharp/Constants.ts
@@ -0,0 +1,83 @@
+export const RESERVED_CSHARP_KEYWORDS = [
+  'abstract',
+  'as',
+  'base',
+  'bool',
+  'break',
+  'byte',
+  'case',
+  'catch',
+  'char',
+  'checked',
+  'class',
+  'const',
+  'continue',
+  'decimal',
+  'default',
+  'delegate',
+  'do',
+  'double',
+  'else',
+  'enum',
+  'event',
+  'explicit',
+  'extern',
+  'false',
+  'finally',
+  'fixed',
+  'float',
+  'for',
+  'foreach',
+  'goto',
+  'if',
+  'implicit',
+  'in',
+  'int',
+  'interface',
+  'internal',
+  'is',
+  'lock',
+  'long',
+  'namespace',
+  'new',
+  'null',
+  'object',
+  'operator',
+  'out',
+  'override',
+  'params',
+  'private',
+  'protected',
+  'public',
+  'readonly',
+  'ref',
+  'return',
+  'sbyte',
+  'sealed',
+  'short',
+  'sizeof',
+  'stackalloc',
+  'static',
+  'string',
+  'struct',
+  'switch',
+  'this',
+  'throw',
+  'true',
+  'try',
+  'typeof',
+  'uint',
+  'ulong',
+  'unchecked',
+  'unsafe',
+  'ushort',
+  'using',
+  'virtual',
+  'void',
+  'volatile',
+  'while'
+];
+
+export function isReservedCSharpKeyword(word: string): boolean {
+  return RESERVED_CSHARP_KEYWORDS.includes(word);
+}
diff --git a/src/generators/csharp/index.ts b/src/generators/csharp/index.ts
new file mode 100644
index 00000000..e1456f71
--- /dev/null
+++ b/src/generators/csharp/index.ts
@@ -0,0 +1,3 @@
+export * from './CSharpGenerator';
+export { CSHARP_DEFAULT_PRESET } from './CSharpPreset';
+export type { CSharpPreset } from './CSharpPreset';
diff --git a/src/generators/csharp/renderers/ClassRenderer.ts b/src/generators/csharp/renderers/ClassRenderer.ts
new file mode 100644
index 00000000..7b310b54
--- /dev/null
+++ b/src/generators/csharp/renderers/ClassRenderer.ts
@@ -0,0 +1,128 @@
+import { CSharpRenderer } from '../CSharpRenderer';
+import { ClassPreset, CommonModel, PropertyType } from '../../../models';
+import { DefaultPropertyNames, getUniquePropertyName } from '../../../helpers';
+import { pascalCase } from 'change-case';
+
+/**
+ * Renderer for CSharp's `struct` type
+ * 
+ * @extends CSharpRenderer
+ */
+export class ClassRenderer extends CSharpRenderer {
+  public async defaultSelf(): Promise<string> {
+    const content = [
+      await this.renderProperties(),
+      await this.runCtorPreset(),
+      await this.renderAccessors(),
+      await this.runAdditionalContentPreset(),
+    ];
+    
+    if (this.model.additionalProperties !== undefined || this.model.patternProperties !== undefined) {
+      this.addDependency('using System.Collections.Generic;');
+    }
+
+    const formattedName = this.nameType(this.model.$id);
+    return `public class ${formattedName} {
+${this.indent(this.renderBlock(content, 2))}
+}`;
+  }
+
+  async renderProperties(): Promise<string> {
+    const properties = this.model.properties || {};
+    const content: string[] = [];
+
+    for (const [propertyName, property] of Object.entries(properties)) {
+      const rendererProperty = await this.runPropertyPreset(propertyName, property);
+      content.push(rendererProperty);
+    }
+    
+    if (this.model.additionalProperties !== undefined) {
+      const propertyName = getUniquePropertyName(this.model, DefaultPropertyNames.additionalProperties);
+      const additionalProperty = await this.runPropertyPreset(propertyName, this.model.additionalProperties, PropertyType.additionalProperty);
+      content.push(additionalProperty);
+    }
+
+    if (this.model.patternProperties !== undefined) {
+      for (const [pattern, patternModel] of Object.entries(this.model.patternProperties)) {
+        const propertyName = getUniquePropertyName(this.model, `${pattern}${DefaultPropertyNames.patternProperties}`);
+        const renderedPatternProperty = await this.runPropertyPreset(propertyName, patternModel, PropertyType.patternProperties);
+        content.push(renderedPatternProperty);
+      }
+    }
+
+    return this.renderBlock(content);
+  }
+
+  async accessorFactory(property: CommonModel, propertyName: string, type: PropertyType): Promise<string> {
+    const formattedAccessorName = pascalCase(this.nameProperty(propertyName, property));
+    let propertyType = this.renderType(property);
+    if (type === PropertyType.additionalProperty || type === PropertyType.patternProperties) {
+      propertyType = `Dictionary<string, ${propertyType}>`;
+    }
+    return `public ${propertyType} ${formattedAccessorName} 
+{
+  ${await this.runGetterPreset(propertyName, property, type)}
+  ${await this.runSetterPreset(propertyName, property, type)}
+}`;
+  }
+  async renderAccessors(): Promise<string> {
+    const properties = this.model.properties || {};
+    const content: string[] = [];
+
+    for (const [propertyName, property] of Object.entries(properties)) {
+      content.push(await this.accessorFactory(property, propertyName, PropertyType.property));
+    }
+
+    if (this.model.additionalProperties !== undefined) {
+      const propertyName = getUniquePropertyName(this.model, DefaultPropertyNames.additionalProperties);
+      content.push(await this.accessorFactory(this.model.additionalProperties, propertyName, PropertyType.additionalProperty));
+    }
+
+    if (this.model.patternProperties !== undefined) {
+      for (const [pattern, patternModel] of Object.entries(this.model.patternProperties)) {
+        const propertyName = getUniquePropertyName(this.model, `${pattern}${DefaultPropertyNames.patternProperties}`);
+        content.push(await this.accessorFactory(patternModel, propertyName, PropertyType.patternProperties));
+      }
+    }
+
+    return this.renderBlock(content, 2);
+  }
+
+  runCtorPreset(): Promise<string> {
+    return this.runPreset('ctor');
+  }
+
+  runPropertyPreset(propertyName: string, property: CommonModel, type: PropertyType = PropertyType.property): Promise<string> {
+    return this.runPreset('property', { propertyName, property, type});
+  }
+
+  runGetterPreset(propertyName: string, property: CommonModel, type: PropertyType = PropertyType.property): Promise<string> {
+    return this.runPreset('getter', { propertyName, property, type});
+  }
+
+  runSetterPreset(propertyName: string, property: CommonModel, type: PropertyType = PropertyType.property): Promise<string> {
+    return this.runPreset('setter', { propertyName, property, type});
+  }
+}
+
+export const CSHARP_DEFAULT_CLASS_PRESET: ClassPreset<ClassRenderer> = {
+  self({ renderer }) {
+    return renderer.defaultSelf();
+  },
+  property({ renderer, propertyName, property, type }) {
+    propertyName = renderer.nameProperty(propertyName, property);
+    let propertyType = renderer.renderType(property);
+    if (type === PropertyType.additionalProperty || type === PropertyType.patternProperties) {
+      propertyType = `Dictionary<string, ${propertyType}>`;
+    }
+    return `private ${propertyType} ${propertyName};`;
+  },
+  getter({ renderer, propertyName, property }) {
+    const formattedPropertyName = renderer.nameProperty(propertyName, property);
+    return `get { return ${formattedPropertyName}; }`;
+  },
+  setter({ renderer, propertyName, property }) {
+    const formattedPropertyName = renderer.nameProperty(propertyName, property);
+    return `set { ${formattedPropertyName} = value; }`;
+  }
+};
diff --git a/src/generators/csharp/renderers/EnumRenderer.ts b/src/generators/csharp/renderers/EnumRenderer.ts
new file mode 100644
index 00000000..5e27810a
--- /dev/null
+++ b/src/generators/csharp/renderers/EnumRenderer.ts
@@ -0,0 +1,50 @@
+import { CSharpRenderer } from '../CSharpRenderer';
+import { EnumPreset } from '../../../models';
+import { pascalCase } from 'change-case';
+
+/**
+ * Renderer for C#'s `enum` type
+ * 
+ * @extends CSharpRenderer
+ */
+export class EnumRenderer extends CSharpRenderer {
+  async defaultSelf(): Promise<string> {
+    const content = [
+      await this.renderItems(),
+    ];
+    const formattedName = this.nameType(this.model.$id);
+    return `public enum ${formattedName} {
+${this.indent(this.renderBlock(content, 2))}
+}`;
+  }
+
+  async renderItems(): Promise<string> {
+    const enums = this.model.enum || [];
+    const items: string[] = [];
+
+    for (const value of enums) {
+      const renderedItem = await this.runItemPreset(value);
+      items.push(renderedItem);
+    }
+
+    const content = items.join(', ');
+    return `${content}`;
+  }
+
+  runItemPreset(item: any): Promise<string> {
+    return this.runPreset('item', { item });
+  }
+}
+
+export const CSHARP_DEFAULT_ENUM_PRESET: EnumPreset<EnumRenderer> = {
+  self({ renderer }) {
+    return renderer.defaultSelf();
+  },
+  item({ item }) {
+    let itemName = String(item);
+    if (typeof item === 'number') {
+      itemName = `Number_${itemName}`;
+    }
+    return pascalCase(itemName);
+  },
+};
diff --git a/src/generators/go/GoRenderer.ts b/src/generators/go/GoRenderer.ts
index 417f5f7f..6f7e40e4 100644
--- a/src/generators/go/GoRenderer.ts
+++ b/src/generators/go/GoRenderer.ts
@@ -64,7 +64,7 @@ export abstract class GoRenderer extends AbstractRenderer<GoOptions> {
    * Renders the name of a field based on provided generator option naming convention field function.
    * 
    * @param fieldName 
-   * @param property
+   * @param field
    */
   nameField(fieldName: string | undefined, field?: CommonModel): string {
     return this.options?.namingConvention?.field 
diff --git a/src/generators/index.ts b/src/generators/index.ts
index 75162421..d4b950bf 100644
--- a/src/generators/index.ts
+++ b/src/generators/index.ts
@@ -1,6 +1,7 @@
 export * from './AbstractGenerator';
 export * from './AbstractRenderer';
 export * from './java';
+export * from './csharp';
 export * from './javascript';
 export * from './typescript';
 export * from './go';
diff --git a/src/generators/java/JavaPreset.ts b/src/generators/java/JavaPreset.ts
index cc800b5c..9dfbf888 100644
--- a/src/generators/java/JavaPreset.ts
+++ b/src/generators/java/JavaPreset.ts
@@ -1,5 +1,4 @@
 import { Preset, ClassPreset, EnumPreset } from '../../models';
-
 import { ClassRenderer, JAVA_DEFAULT_CLASS_PRESET } from './renderers/ClassRenderer';
 import { EnumRenderer, JAVA_DEFAULT_ENUM_PRESET } from './renderers/EnumRenderer';
 


Test patch:
diff --git a/.github/workflows/blackbox-testing.yml b/.github/workflows/blackbox-testing.yml
index 5858a35b..285e69d9 100644
--- a/.github/workflows/blackbox-testing.yml
+++ b/.github/workflows/blackbox-testing.yml
@@ -6,7 +6,7 @@ on:
 jobs:
   test:
     if: github.event.pull_request.draft == false
-    name: TypeScript ${{ matrix.os }}
+    name: BlackBox testing ${{ matrix.os }}
     runs-on: ${{ matrix.os }}
     strategy:
       matrix:
@@ -24,5 +24,13 @@ jobs:
         with:
           distribution: 'adopt'
           java-version: '11'
+      - if: matrix.os != 'windows-latest'
+        name: Setup dotnet
+        uses: actions/setup-dotnet@v1
+        with:
+          dotnet-version: '5.0.x'
+      - if: matrix.os == 'windows-latest'
+        name: Setup csc.exe
+        uses: yoavain/Setup-CSC@v7
       - name: Test output
         run: npm run test:blackbox
\ No newline at end of file
diff --git a/test/blackbox/Dummy.spec.ts b/test/blackbox/Dummy.spec.ts
index d50715ef..8504ed81 100644
--- a/test/blackbox/Dummy.spec.ts
+++ b/test/blackbox/Dummy.spec.ts
@@ -1,7 +1,6 @@
 import * as path from 'path';
-import { TypeScriptGenerator, JavaGenerator, JavaScriptGenerator, GoGenerator } from '../../src';
-import { execCommand, generateModels, renderModels } from './utils/Utils';
-import { renderJavaModelsToSeparateFiles } from './utils/Utils';
+import { TypeScriptGenerator, JavaGenerator, JavaScriptGenerator, GoGenerator, CSharpGenerator } from '../../src';
+import { execCommand, generateModels, renderModels, renderModelsToSeparateFiles } from './utils/Utils';
 const fileToGenerate = path.resolve(__dirname, './docs/dummy.json');
 describe('Dummy JSON Schema file', () => {
   jest.setTimeout(100000);
@@ -12,11 +11,22 @@ describe('Dummy JSON Schema file', () => {
       expect(generatedModels).not.toHaveLength(0);
       const renderOutputPath = path.resolve(__dirname, './output/java/class');
       const dependencyPath = path.resolve(__dirname, './dependencies/java/*');
-      await renderJavaModelsToSeparateFiles(generatedModels, renderOutputPath);
+      await renderModelsToSeparateFiles(generatedModels, renderOutputPath, 'java');
       const compileCommand = `javac  -cp ${dependencyPath} ${path.resolve(renderOutputPath, '*.java')}`;
       await execCommand(compileCommand);
     });
   });
+  describe('should be able to generate and compile C#', () => {
+    test('class', async () => {
+      const generator = new CSharpGenerator();
+      const generatedModels = await generateModels(fileToGenerate, generator);
+      expect(generatedModels).not.toHaveLength(0);
+      const renderOutputPath = path.resolve(__dirname, './output/csharp');
+      await renderModelsToSeparateFiles(generatedModels, renderOutputPath, 'cs');
+      const compileCommand = `csc /target:library /out:${path.resolve(renderOutputPath, './compiled.dll')} ${path.resolve(renderOutputPath, '*.cs')}`;
+      await execCommand(compileCommand);
+    });
+  });
 
   describe('should be able to generate and transpile TS', () => {
     test('class', async () => {
diff --git a/test/blackbox/utils/Utils.ts b/test/blackbox/utils/Utils.ts
index 30c10e71..57f1146a 100644
--- a/test/blackbox/utils/Utils.ts
+++ b/test/blackbox/utils/Utils.ts
@@ -30,7 +30,8 @@ export async function execCommand(command: string) : Promise<void> {
       Promise.reject(stderr);
     }
   } catch (e) {
-    Promise.reject(e);
+    const wrapperError = new Error(`Error: ${e.stack}; Stdout: ${e.stdout}`);
+    Promise.reject(wrapperError);
   }
 }
 
@@ -40,11 +41,11 @@ export async function execCommand(command: string) : Promise<void> {
  * @param generatedModels to write to file
  * @param outputPath absolute path to output directory
  */
-export async function renderJavaModelsToSeparateFiles(generatedModels: OutputModel[], outputPath: string): Promise<void> {
+export async function renderModelsToSeparateFiles(generatedModels: OutputModel[], outputPath: string, extension: string): Promise<void> {
   await fs.rm(outputPath, { recursive: true, force: true });
   await fs.mkdir(outputPath, { recursive: true });
   for (const outputModel of generatedModels) {
-    const outputFilePath = path.resolve(outputPath, `${FormatHelpers.toPascalCase(outputModel.model.$id || 'undefined')}.java`);
+    const outputFilePath = path.resolve(outputPath, `${FormatHelpers.toPascalCase(outputModel.model.$id || 'undefined')}.${extension}`);
     const outputContent = `
 ${outputModel.dependencies.join('\n')}
 ${outputModel.result}
diff --git a/test/generators/csharp/CSharpGenerator.spec.ts b/test/generators/csharp/CSharpGenerator.spec.ts
new file mode 100644
index 00000000..fb05294b
--- /dev/null
+++ b/test/generators/csharp/CSharpGenerator.spec.ts
@@ -0,0 +1,155 @@
+import { CSharpGenerator } from '../../../src/generators';
+
+describe('CSharpGenerator', () => {
+  let generator: CSharpGenerator;
+  beforeEach(() => {
+    generator = new CSharpGenerator();
+  });
+
+  test('should not render reserved keyword', async () => {
+    const doc = {
+      $id: 'Address',
+      type: 'object',
+      properties: {
+        enum: { type: 'string' },
+        reservedEnum: { type: 'string' }
+      },
+      additionalProperties: false
+    };
+
+    const inputModel = await generator.process(doc);
+    const model = inputModel.models['Address'];
+
+    let classModel = await generator.renderClass(model, inputModel);
+    expect(classModel.result).toMatchSnapshot();
+
+    classModel = await generator.render(model, inputModel);
+    expect(classModel.result).toMatchSnapshot();
+  });
+  test('should render `class` type', async () => {
+    const doc = {
+      $id: '_address',
+      type: 'object',
+      properties: {
+        street_name: { type: 'string' },
+        city: { type: 'string', description: 'City description' },
+        state: { type: 'string' },
+        house_number: { type: 'number' },
+        marriage: { type: 'boolean', description: 'Status if marriage live in given house' },
+        members: { oneOf: [{ type: 'string' }, { type: 'number' }, { type: 'boolean' }], },
+        tuple_type: { type: 'array', items: [{ type: 'string' }, { type: 'number' }] },
+        array_type: { type: 'array', items: { type: 'string' } },
+      },
+      required: ['street_name', 'city', 'state', 'house_number', 'array_type'],
+      additionalProperties: {
+        type: 'string'
+      },
+      patternProperties: {
+        '^S(.?*)test&': {
+          type: 'string'
+        }
+      },
+    };
+
+    const inputModel = await generator.process(doc);
+    const model = inputModel.models['_address'];
+
+    let classModel = await generator.renderClass(model, inputModel);
+    expect(classModel.result).toMatchSnapshot();
+    expect(classModel.dependencies).toEqual(['using System.Collections.Generic;']);
+
+    classModel = await generator.renderClass(model, inputModel);
+    expect(classModel.result).toMatchSnapshot();
+    expect(classModel.dependencies).toEqual(['using System.Collections.Generic;']);
+  });
+
+  test('should work custom preset for `class` type', async () => {
+    const doc = {
+      $id: 'CustomClass',
+      type: 'object',
+      properties: {
+        property: { type: 'string' },
+      },
+      additionalProperties: {
+        type: 'string'
+      }
+    };
+
+    generator = new CSharpGenerator({ presets: [
+      {
+        class: {
+          property({ propertyName, property, renderer }) {
+            return `private ${propertyName} ${renderer.renderType(property)}`;
+          },
+        }
+      }
+    ] });
+
+    const inputModel = await generator.process(doc);
+    const model = inputModel.models['CustomClass'];
+    
+    const classModel = await generator.render(model, inputModel);
+    expect(classModel.result).toMatchSnapshot();
+    expect(classModel.dependencies).toEqual(['using System.Collections.Generic;']);
+  });
+
+  describe.each([
+    {
+      name: 'with enums sharing same type',
+      doc: {
+        $id: 'States',
+        type: 'string',
+        enum: ['Texas', 'Alabama', 'California'],
+      }
+    },
+    {
+      name: 'with enums of mixed types',
+      doc: {
+        $id: 'Things',
+        enum: ['Texas', 1, false],
+      }
+    },
+  ])('should render `enum` type $name', ({doc}) => {
+    test('should not be empty', async () => {
+      const inputModel = await generator.process(doc);
+      const model = inputModel.models[doc.$id];
+
+      let enumModel = await generator.render(model, inputModel);
+      expect(enumModel.result).toMatchSnapshot();
+      expect(enumModel.dependencies).toEqual([]);
+        
+      enumModel = await generator.renderEnum(model, inputModel);
+      expect(enumModel.result).toMatchSnapshot();
+      expect(enumModel.dependencies).toEqual([]);
+    });
+  });
+
+  test('should work custom preset for `enum` type', async () => {
+    const doc = {
+      $id: 'CustomEnum',
+      type: 'string',
+      enum: ['Texas', 'Alabama', 'California'],
+    };
+
+    generator = new CSharpGenerator({ presets: [
+      {
+        enum: {
+          self({ content }) {
+            return content;
+          },
+        }
+      }
+    ] });
+
+    const inputModel = await generator.process(doc);
+    const model = inputModel.models['CustomEnum'];
+    
+    let enumModel = await generator.render(model, inputModel);
+    expect(enumModel.result).toMatchSnapshot();
+    expect(enumModel.dependencies).toEqual([]);
+    
+    enumModel = await generator.renderEnum(model, inputModel);
+    expect(enumModel.result).toMatchSnapshot();
+    expect(enumModel.dependencies).toEqual([]);
+  });
+});
diff --git a/test/generators/csharp/CSharpRenderer.spec.ts b/test/generators/csharp/CSharpRenderer.spec.ts
new file mode 100644
index 00000000..213f1198
--- /dev/null
+++ b/test/generators/csharp/CSharpRenderer.spec.ts
@@ -0,0 +1,67 @@
+import { CSharpGenerator } from '../../../src';
+import { CSharpRenderer } from '../../../src/generators/csharp/CSharpRenderer';
+import { CommonInputModel, CommonModel } from '../../../src/models';
+class MockCSharpRenderer extends CSharpRenderer {
+
+}
+describe('CSharpRenderer', () => {
+  let renderer: MockCSharpRenderer;
+  beforeEach(() => {
+    renderer = new MockCSharpRenderer(CSharpGenerator.defaultOptions, new CSharpGenerator(), [], new CommonModel(), new CommonInputModel());
+  });
+
+  describe('toCSharpType()', () => {
+    test('Should render undefined as dynamic type', () => {
+      expect(renderer.toCSharpType(undefined, new CommonModel())).toEqual('dynamic');
+    });
+    test('Should render integer as int type', () => {
+      expect(renderer.toCSharpType('integer', new CommonModel())).toEqual('int');
+    });
+    test('Should render number as float type', () => {
+      expect(renderer.toCSharpType('number', new CommonModel())).toEqual('float');
+    });
+    test('Should render array as slice of the type', () => {
+      const model = new CommonModel();
+      model.items = CommonModel.toCommonModel({ type: 'number' });
+      expect(renderer.toCSharpType('array', model)).toEqual('float[]');
+    });
+    test('Should render tuple with multiple types as dynamic', () => {
+      const model = new CommonModel();
+      model.items = [CommonModel.toCommonModel({ type: 'number' }), CommonModel.toCommonModel({ type: 'string' })];
+      expect(renderer.toCSharpType('array', model)).toEqual('dynamic[]');
+    });
+    test('Should render object as dynamic type', () => {
+      expect(renderer.toCSharpType('object', new CommonModel())).toEqual('object');
+    });
+  });
+  describe('nameType()', () => {
+    test('Should call naming convention', () => {
+      const name = renderer.nameType('type__someType');
+      expect(name).toEqual('TypeSomeType');
+    });
+  });
+  describe('nameProperty()', () => {
+    test('Should call naming convention', () => {
+      const name = renderer.nameProperty('property__someProperty');
+      expect(name).toEqual('propertySomeProperty');
+    });
+  });
+  describe('renderType()', () => {
+    test('Should render refs using type naming convention', () => {
+      const model = new CommonModel();
+      model.$ref = '<anonymous-schema-1>';
+      const renderedType = renderer.renderType(model);
+      expect(renderedType).toEqual('AnonymousSchema_1');
+    });
+    test('Should render single union type', () => {
+      const model = CommonModel.toCommonModel({ type: ['number'] });
+      const renderedType = renderer.renderType(model);
+      expect(renderedType).toEqual('float');
+    });
+    test('Should render union types with multiple types as slice of interface', () => {
+      const model = CommonModel.toCommonModel({ type: ['number', 'string'] });
+      const renderedType = renderer.renderType(model);
+      expect(renderedType).toEqual('dynamic');
+    });
+  });
+});
diff --git a/test/generators/csharp/__snapshots__/CSharpGenerator.spec.ts.snap b/test/generators/csharp/__snapshots__/CSharpGenerator.spec.ts.snap
new file mode 100644
index 00000000..b511ba34
--- /dev/null
+++ b/test/generators/csharp/__snapshots__/CSharpGenerator.spec.ts.snap
@@ -0,0 +1,244 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CSharpGenerator should not render reserved keyword 1`] = `
+"public class Address {
+  private string reservedReservedEnum;
+  private string reservedEnum;
+
+  public string ReservedReservedEnum 
+  {
+    get { return reservedReservedEnum; }
+    set { reservedReservedEnum = value; }
+  }
+
+  public string ReservedEnum 
+  {
+    get { return reservedEnum; }
+    set { reservedEnum = value; }
+  }
+}"
+`;
+
+exports[`CSharpGenerator should not render reserved keyword 2`] = `
+"public class Address {
+  private string reservedReservedEnum;
+  private string reservedEnum;
+
+  public string ReservedReservedEnum 
+  {
+    get { return reservedReservedEnum; }
+    set { reservedReservedEnum = value; }
+  }
+
+  public string ReservedEnum 
+  {
+    get { return reservedEnum; }
+    set { reservedEnum = value; }
+  }
+}"
+`;
+
+exports[`CSharpGenerator should render \`class\` type 1`] = `
+"public class Address {
+  private string streetName;
+  private string city;
+  private string state;
+  private float houseNumber;
+  private bool marriage;
+  private dynamic members;
+  private dynamic[] tupleType;
+  private string[] arrayType;
+  private Dictionary<string, string> additionalProperties;
+  private Dictionary<string, string> sTestPatternProperties;
+
+  public string StreetName 
+  {
+    get { return streetName; }
+    set { streetName = value; }
+  }
+
+  public string City 
+  {
+    get { return city; }
+    set { city = value; }
+  }
+
+  public string State 
+  {
+    get { return state; }
+    set { state = value; }
+  }
+
+  public float HouseNumber 
+  {
+    get { return houseNumber; }
+    set { houseNumber = value; }
+  }
+
+  public bool Marriage 
+  {
+    get { return marriage; }
+    set { marriage = value; }
+  }
+
+  public dynamic Members 
+  {
+    get { return members; }
+    set { members = value; }
+  }
+
+  public dynamic[] TupleType 
+  {
+    get { return tupleType; }
+    set { tupleType = value; }
+  }
+
+  public string[] ArrayType 
+  {
+    get { return arrayType; }
+    set { arrayType = value; }
+  }
+
+  public Dictionary<string, string> AdditionalProperties 
+  {
+    get { return additionalProperties; }
+    set { additionalProperties = value; }
+  }
+
+  public Dictionary<string, string> STestPatternProperties 
+  {
+    get { return sTestPatternProperties; }
+    set { sTestPatternProperties = value; }
+  }
+}"
+`;
+
+exports[`CSharpGenerator should render \`class\` type 2`] = `
+"public class Address {
+  private string streetName;
+  private string city;
+  private string state;
+  private float houseNumber;
+  private bool marriage;
+  private dynamic members;
+  private dynamic[] tupleType;
+  private string[] arrayType;
+  private Dictionary<string, string> additionalProperties;
+  private Dictionary<string, string> sTestPatternProperties;
+
+  public string StreetName 
+  {
+    get { return streetName; }
+    set { streetName = value; }
+  }
+
+  public string City 
+  {
+    get { return city; }
+    set { city = value; }
+  }
+
+  public string State 
+  {
+    get { return state; }
+    set { state = value; }
+  }
+
+  public float HouseNumber 
+  {
+    get { return houseNumber; }
+    set { houseNumber = value; }
+  }
+
+  public bool Marriage 
+  {
+    get { return marriage; }
+    set { marriage = value; }
+  }
+
+  public dynamic Members 
+  {
+    get { return members; }
+    set { members = value; }
+  }
+
+  public dynamic[] TupleType 
+  {
+    get { return tupleType; }
+    set { tupleType = value; }
+  }
+
+  public string[] ArrayType 
+  {
+    get { return arrayType; }
+    set { arrayType = value; }
+  }
+
+  public Dictionary<string, string> AdditionalProperties 
+  {
+    get { return additionalProperties; }
+    set { additionalProperties = value; }
+  }
+
+  public Dictionary<string, string> STestPatternProperties 
+  {
+    get { return sTestPatternProperties; }
+    set { sTestPatternProperties = value; }
+  }
+}"
+`;
+
+exports[`CSharpGenerator should render \`enum\` type $name should not be empty 1`] = `
+"public enum States {
+  Texas, Alabama, California
+}"
+`;
+
+exports[`CSharpGenerator should render \`enum\` type $name should not be empty 2`] = `
+"public enum States {
+  Texas, Alabama, California
+}"
+`;
+
+exports[`CSharpGenerator should render \`enum\` type $name should not be empty 3`] = `
+"public enum Things {
+  Texas, Number_1, False
+}"
+`;
+
+exports[`CSharpGenerator should render \`enum\` type $name should not be empty 4`] = `
+"public enum Things {
+  Texas, Number_1, False
+}"
+`;
+
+exports[`CSharpGenerator should work custom preset for \`class\` type 1`] = `
+"public class CustomClass {
+  private property string
+  private additionalProperties string
+
+  public string Property 
+  {
+    get { return property; }
+    set { property = value; }
+  }
+
+  public Dictionary<string, string> AdditionalProperties 
+  {
+    get { return additionalProperties; }
+    set { additionalProperties = value; }
+  }
+}"
+`;
+
+exports[`CSharpGenerator should work custom preset for \`enum\` type 1`] = `
+"public enum CustomEnum {
+  Texas, Alabama, California
+}"
+`;
+
+exports[`CSharpGenerator should work custom preset for \`enum\` type 2`] = `
+"public enum CustomEnum {
+  Texas, Alabama, California
+}"
+`;