Equatable.Generator
3.0.0-beta.1
See the version list below for details.
dotnet add package Equatable.Generator --version 3.0.0-beta.1
NuGet\Install-Package Equatable.Generator -Version 3.0.0-beta.1
<PackageReference Include="Equatable.Generator" Version="3.0.0-beta.1"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
<PackageVersion Include="Equatable.Generator" Version="3.0.0-beta.1" />
<PackageReference Include="Equatable.Generator"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
paket add Equatable.Generator --version 3.0.0-beta.1
#r "nuget: Equatable.Generator, 3.0.0-beta.1"
#:package Equatable.Generator@3.0.0-beta.1
#addin nuget:?package=Equatable.Generator&version=3.0.0-beta.1&prerelease
#tool nuget:?package=Equatable.Generator&version=3.0.0-beta.1&prerelease
Equatable.Generator
Source generator for Equals and GetHashCode with attribute based control of equality implementation
Features
- Override
EqualsandGetHashCode - Implement
IEquatable<T> - Support
class,recordandstructtypes - Support
EqualityComparerper property via attribute - Attribute based control of equality implementation.
- Attribute comparers supported: String, Sequence, Dictionary, HashSet, Reference, and Custom
- No runtime dependencies. Library is compile time dependence only.
Usage
Add package
Add the nuget package to your projects.
dotnet add package Equatable.Generator
Prevent including Equatable.Generator as a dependency
<PackageReference Include="Equatable.Generator" PrivateAssets="all" />
Requirements
This library requires:
- Target framework .NET Standard 2.0 or greater
- Project C#
LangVersion8.0 or higher
Equatable Attributes
Place [Equatable] attribute on a class, record or struct. The source generator will create a partial with overrides for Equals and GetHashCode for all public properties.
[Equatable]Marks the class to generate overrides forEqualsandGetHashCode
By default, string properties use StringComparer.Ordinal, which is equivalent to string.Equals. Other reference types use EqualityComparer<T>.Default. Customize the comparer used with the following attributes.
[IgnoreEquality]Ignore property inEqualsandGetHashCodeimplementations[StringEquality]Use specifiedStringComparerwhen comparing strings, overriding the defaultStringComparer.Ordinal[SequenceEquality]UseEnumerable.SequenceEqualto determine whether enumerables are equal[DictionaryEquality]Use to determine if dictionaries are equal[HashSetEquality]UseISet<T>.SetEqualsto determine whether enumerables are equal[ReferenceEquality]UseObject.ReferenceEqualsto determines whether instances are the same instance[EqualityComparer]Use the specifiedEqualityComparer
Example Usage
Example of using the attributes to customize the source generation of Equals and GetHashCode
[Equatable]
public partial class UserImport
{
[StringEquality(StringComparison.OrdinalIgnoreCase)]
public string EmailAddress { get; set; } = null!;
public string? DisplayName { get; set; }
public string? FirstName { get; set; }
public string? LastName { get; set; }
public DateTimeOffset? LockoutEnd { get; set; }
public DateTimeOffset? LastLogin { get; set; }
[IgnoreEquality]
public string FullName => $"{FirstName} {LastName}";
[HashSetEquality]
public HashSet<string>? Roles { get; set; }
[DictionaryEquality]
public Dictionary<string, int>? Permissions { get; set; }
[SequenceEquality]
public List<DateTimeOffset>? History { get; set; }
}
Works for record types too
[Equatable]
public partial record StatusRecord(
int Id,
[property: StringEquality(StringComparison.OrdinalIgnoreCase)] string Name,
string? Description,
int DisplayOrder,
bool IsActive,
[property: SequenceEquality] List<string> Versions
);
Learn more about Target Frameworks and .NET Standard.
This package has no dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 3.0.0 | 1,165 | 8/4/2026 |
| 3.0.0-beta.2 | 56 | 8/3/2026 |
| 3.0.0-beta.1 | 47 | 8/3/2026 |
| 2.2.1 | 12,484 | 4/10/2026 |
| 2.2.0 | 233 | 4/8/2026 |
| 2.1.0 | 12,520 | 10/22/2025 |
| 2.0.0 | 6,244 | 11/14/2024 |
| 1.1.0 | 602 | 9/7/2024 |
| 1.1.0-beta.1 | 178 | 9/7/2024 |
| 1.0.0 | 332 | 9/5/2024 |
| 1.0.0-beta.3 | 144 | 9/5/2024 |
| 1.0.0-beta.2 | 144 | 9/5/2024 |
| 1.0.0-beta.1 | 172 | 9/5/2024 |
| 1.0.0-alpha.2 | 172 | 9/4/2024 |
| 1.0.0-alpha.1 | 165 | 9/4/2024 |