Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/SzymonHalucha/Minerals.AutoMixins
Package for automatic mixin design pattern generation using an incremental source generator
https://github.com/SzymonHalucha/Minerals.AutoMixins
csharp csharp-sourcegenerator design-patterns dotnet mixin mixins roslyn
Last synced: 2 days ago
JSON representation
Package for automatic mixin design pattern generation using an incremental source generator
- Host: GitHub
- URL: https://github.com/SzymonHalucha/Minerals.AutoMixins
- Owner: SzymonHalucha
- License: mit
- Created: 2024-03-12T11:32:24.000Z (8 months ago)
- Default Branch: main
- Last Pushed: 2024-05-16T19:33:54.000Z (6 months ago)
- Last Synced: 2024-11-06T17:09:30.368Z (4 days ago)
- Topics: csharp, csharp-sourcegenerator, design-patterns, dotnet, mixin, mixins, roslyn
- Language: C#
- Homepage:
- Size: 44.9 KB
- Stars: 3
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- RSCG_Examples - https://github.com/SzymonHalucha/Minerals.AutoMixins
README
# Minerals.AutoMixins
![GitHub License](https://img.shields.io/github/license/SzymonHalucha/Minerals.AutoMixins?style=for-the-badge)
![NuGet Version](https://img.shields.io/nuget/v/Minerals.AutoMixins?style=for-the-badge)
![NuGet Downloads](https://img.shields.io/nuget/dt/Minerals.AutoMixins?style=for-the-badge)[Package on nuget.org](https://www.nuget.org/packages/Minerals.AutoMixins/)
This NuGet package provides a capability to automatically generate a [mix-in](https://en.wikipedia.org/wiki/Mixin) design pattern for C# classes by using only one attribute. This allows you to easily extend the functionality of existing classes.
## Features
- **Easy mix-in definition:** Mix-in object are defined by using the ```[GenerateMixin]``` attribute.
- **Easy addition of mix-ins to a class:** To add a mix-in object to a class, use the ```[AddMixin(typeof(ExampleMixinClass))]``` attribute.
- **Optimized code generation:** The package uses an incremental source generator, so it doesn't significantly slow down the compilation process.
- **Compatibility with .NET Standard 2.0 and C# 7.3+:** Works on a wide range of platforms and development environments.## Installation
Add the Minerals.AutoMixins nuget package to your C# project using the following methods:
### 1. Project file definition
```xml
```
### 2. dotnet command
```bat
dotnet add package Minerals.AutoMixins
```## Why choose this package instead of the Default Interface Implementation?
Because the C# language option called "Default Interface Implementation", has limited runtime platform support. The Minerals.AutoMixins package is compatible with ```netstandard2.0``` and C# language version 7.3+.
## Usage
To define a mix-in object, add the ```[GenerateMixin]``` attribute to the selected class.
### Defining mix-in objects
```csharp
namespace Examples
{
[Minerals.AutoMixins.GenerateMixin]
public class ExampleMixin1
{
public float Property1 { get; set; } = 0.5f;private int _field1 = 0;
private void Method1()
{
Console.WriteLine("Test1");
}
}[Minerals.AutoMixins.GenerateMixin]
public class ExampleMixin2
{
public string PropertyText1 { get; set; } = "Test2";
}
}
```### Using mix-in objects
To use the selected mix-in object, add the ```[AddMixin(typeof(ExampleMixin1))]``` attribute to the selected class. The class implementing the **AddMixin** attribute must have the **partial** modifier to work properly.
```csharp
namespace Examples
{
[Minerals.AutoMixins.AddMixin(typeof(ExampleMixin1))]
public partial class ExampleClass
{
public int MyProperty { get; set; } = 3;
}
}
```The code above will generate an ```ExampleClass.g.cs``` file with a partial class ```ExampleClass```.
```csharp
namespace Examples
{
[global::System.Diagnostics.DebuggerNonUserCode]
[global::System.Runtime.CompilerServices.CompilerGenerated]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public partial class ExampleClass
{
// MixinType: ExampleMixin1
public float Property1 { get; set; } = 0.5f;
private int _field1 = 0;
private void Method1()
{
Console.WriteLine("Test1");
}
}
}
```### Multiple mix-ins
This package allows you to add multiple mix-in objects to a single class through attribute arguments ```[AddMixin(typeof(ExampleMixin1), typeof(ExampleMixin2))]```.
```csharp
namespace Examples
{
[Minerals.AutoMixins.AddMixin(typeof(ExampleMixin1), typeof(ExampleMixin2))]
public partial class ExampleClass
{
public int MyProperty { get; set; } = 3;public void MyMethod()
{}
}
}
```The code above will generate an ```ExampleClass.g.cs``` file with a partial class ```ExampleClass```.
```csharp
namespace Examples
{
[global::System.Diagnostics.DebuggerNonUserCode]
[global::System.Runtime.CompilerServices.CompilerGenerated]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public partial class ExampleClass
{
// MixinType: ExampleMixin1
public float Property1 { get; set; } = 0.5f;
private int _field1 = 0;
private void Method1()
{
Console.WriteLine("Test1");
}
// MixinType: ExampleMixin2
public string PropertyText1 { get; set; } = "Test2";
public string MethodText1()
{
return PropertyText1;
}
}
}
```## Versioning
We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [branches on this repository](https://github.com/SzymonHalucha/Minerals.AutoMixins/branches).
## Authors
- **Szymon Hałucha** - Maintainer
See also the list of [contributors](https://github.com/SzymonHalucha/Minerals.AutoMixins/contributors) who participated in this project.
## License
This project is licensed under the MIT License - see the [LICENSE](./LICENSE) file for details.