Net Core:用于比较两个 Class 模型的 IEquatable/Equals 的代码生成

Net Core: Code Generation for IEquatable/Equals for Comparing Two Class Models

我们从 Entity Framework 构建数据库以创建 class 模型。我们有 1000 多个 classes。现在我们正在实施单元测试,以比较 classes 插入实际 class 与预期 class。以下网站推荐以下方法来比较所有成员。

我是否必须为所有 1000 多个 classes 写这个?或者有没有办法使用 Visual Studio 中的自动代码生成来创建所有这些 IEquatable?也许用 T4?

https://grantwinney.com/how-to-compare-two-objects-testing-for-equality-in-c/

public class Person : IEquatable<Person> 
{
    public string Name { get; set; }
    public int Age { get; set; }

    public bool Equals(Person other)
    {
        if (ReferenceEquals(other, null))
            return false;

        if (ReferenceEquals(this, other))
            return true;

        return Name.Equals(other.Name) && Age.Equals(other.Age);
    }

https://docs.microsoft.com/en-us/visualstudio/modeling/code-generation-and-t4-text-templates?view=vs-2019

下面的 Teamwork Guy 回答很好,需要为 1000+ classes 实现这种方法。

是的,在 Visual Studio >=2017 或使用 ReSharper 时似乎有可能:

https://docs.microsoft.com/en-us/visualstudio/ide/reference/generate-equals-gethashcode-methods?view=vs-2017

这对于 1000+ 类 来说仍然很耗时。您可以查看 Visual Studio 用于插件开发的 API,看看是否可以通过编程方式为整个文件列表触发此选项。

如果您只为测试断言实现 Equals,我会使用类似 FluentAssertions to do assertions. The various BeEquivalentTo 方法的库来比较对象图并提供详细的错误消息(例如,预期年龄为 x 但实际为 y),这通常更好比你从实现自己的 Equals 方法中得到的要多。它集成了所有开箱即用的主要测试框架(mstest、nunit、xunit.net)。