RSCG – Equatable.Generator
RSCG – Equatable.Generator
name | Equatable.Generator |
nuget | https://www.nuget.org/packages/Equatable.Generator/ |
link | https://github.com/loresoft/Equatable.Generator |
author | Eden Prairie |
Generating Equals from properties
This is how you can use Equatable.Generator .
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> <PropertyGroup> <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles> <CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath> </PropertyGroup> <ItemGroup> <PackageReference Include="Equatable.Generator" Version="2.0.0" /> </ItemGroup> </Project>
The code that you will use is
// See https://aka.ms/new-console-template for more information using GeneratorEqualsDemo; var p1 = new Person() { ID = 1, FirstName = "Andrei", LastName = "Ignat" }; var p2= new Person() { ID = 2, FirstName = "aNdrei", LastName = "Ignat" }; Console.WriteLine(p1==p2);
using Equatable.Attributes; namespace GeneratorEqualsDemo; [Equatable] partial class Person { [IgnoreEquality] public int ID { get; set; } [StringEquality(StringComparison.OrdinalIgnoreCase)] public string? FirstName { get; set; } [StringEquality(StringComparison.OrdinalIgnoreCase)] public string? LastName { get; set; } }
The code that is generated is
// <auto-generated /> #nullable enable namespace GeneratorEqualsDemo { partial class Person : global::System.IEquatable<global::GeneratorEqualsDemo.Person?> { /// <inheritdoc /> [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Equatable.SourceGenerator", "2.0.0+10ad4b045a688eb10980afcd11ddb8e64505eda6")] public bool Equals(global::GeneratorEqualsDemo.Person? other) { return !(other is null) && global::System.StringComparer.OrdinalIgnoreCase.Equals(FirstName, other.FirstName) && global::System.StringComparer.OrdinalIgnoreCase.Equals(LastName, other.LastName); } /// <inheritdoc /> [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Equatable.SourceGenerator", "2.0.0+10ad4b045a688eb10980afcd11ddb8e64505eda6")] public override bool Equals(object? obj) { return Equals(obj as global::GeneratorEqualsDemo.Person); } /// <inheritdoc /> [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Equatable.SourceGenerator", "2.0.0+10ad4b045a688eb10980afcd11ddb8e64505eda6")] public static bool operator ==(global::GeneratorEqualsDemo.Person? left, global::GeneratorEqualsDemo.Person? right) { return global::System.Collections.Generic.EqualityComparer<global::GeneratorEqualsDemo.Person?>.Default.Equals(left, right); } /// <inheritdoc /> [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Equatable.SourceGenerator", "2.0.0+10ad4b045a688eb10980afcd11ddb8e64505eda6")] public static bool operator !=(global::GeneratorEqualsDemo.Person? left, global::GeneratorEqualsDemo.Person? right) { return !(left == right); } /// <inheritdoc /> [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Equatable.SourceGenerator", "2.0.0+10ad4b045a688eb10980afcd11ddb8e64505eda6")] public override int GetHashCode(){ int hashCode = 1938039292; hashCode = (hashCode * -1521134295) + global::System.StringComparer.OrdinalIgnoreCase.GetHashCode(FirstName!); hashCode = (hashCode * -1521134295) + global::System.StringComparer.OrdinalIgnoreCase.GetHashCode(LastName!); return hashCode; } } }
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/Equatable.Generator
Leave a Reply