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