name | Tortuga.Shipwright |
nuget | https://www.nuget.org/packages/Tortuga.Shipwright/ |
link | https://github.com/TortugaResearch/Tortuga.Shipwright |
author | Tortuga Research |
Generate mixin between classes
This is how you can use Tortuga.Shipwright .
The code that you start with is
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net9.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <!-- Code Generator --> <ItemGroup> <PackageReference Include="Tortuga.Shipwright" Version="0.9.0" > <PrivateAssets>all</PrivateAssets> </PackageReference> <PackageReference Include="Tortuga.Shipwright.Shared" Version="0.9.0" /> </ItemGroup> <PropertyGroup> <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles> <CompilerGeneratedFilesOutputPath>GX</CompilerGeneratedFilesOutputPath> </PropertyGroup> <ItemGroup> <!-- Don't include the output from a previous source generator execution into future runs; the */** trick here ensures that there's at least one subdirectory, which is our key that it's coming from a source generator as opposed to something that is coming from some other tool. --> <Compile Remove="$(CompilerGeneratedFilesOutputPath)/*/**/*.cs" /> </ItemGroup> </Project>
The code that you will use is
// See https://aka.ms/new-console-template for more information using MixinConsoleDemo; Console.WriteLine("Hello, World!"); Employee p = new Employee(); p.Name="Andrei Ignat"; p.Age = 55; p.Salary = 1000; Console.WriteLine($"Name: {p.Name}, Age: {p.Age}, Salary: {p.Salary}");
using Tortuga.Shipwright; namespace MixinConsoleDemo; internal class Person { [Expose] public string Name { get; set; } = string.Empty; [Expose] public int Age { get; set; } }
using Tortuga.Shipwright; namespace MixinConsoleDemo; [UseTrait(typeof(Person))] internal partial class Employee { public decimal Salary { get; set; } }
The code that is generated is
/* Container class: MixinConsoleDemo.Employee Adding trait: MixinConsoleDemo.Person */
//This file was generated by Tortuga Shipwright namespace MixinConsoleDemo { partial class Employee { // These fields and/or properties hold the traits. They should not be referenced directly. private MixinConsoleDemo.Person __Trait0 = new(); // Exposing trait MixinConsoleDemo.Person public System.Int32 Age { get => __Trait0.Age; set => __Trait0.Age = value; } public System.String Name { get => __Trait0.Name; set => __Trait0.Name = value; } } }
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/Tortuga.Shipwright