Awesome
Minerals.AutoMixins
This NuGet package provides a capability to automatically generate a mix-in 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
<PackageReference Include="Minerals.AutoMixins" Version="0.2.1" />
2. dotnet command
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
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.
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
.
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))]
.
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
.
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 for versioning. For the versions available, see the branches on this repository.
Authors
- Szymon Hałucha - Maintainer
See also the list of contributors who participated in this project.
License
This project is licensed under the MIT License - see the LICENSE file for details.