.net 基于等效反射的FluentAssertions

.net 基于等效反射的FluentAssertions,.net,fluent-assertions,.net,Fluent Assertions,我有一个简单的课程: public class MyClass() { public string Property1 {get;set;} public string Property2 {get;set;} } 有没有办法在没有相等方法实现的情况下将这个类的两个实例关联为相等的(我想反射可能很适合这里)?我不想仅仅为了测试而实现Equal)。请参阅官方文档中的以下摘录: 通过按名称比较整个对象的属性,可以断言它们的相等性。即使属性的类型不同,但存在内置转换(通过Convert类)

我有一个简单的课程:

public class MyClass()
{
  public string Property1 {get;set;}
  public string Property2 {get;set;}
}

有没有办法在没有相等方法实现的情况下将这个类的两个实例关联为相等的(我想反射可能很适合这里)?我不想仅仅为了测试而实现Equal)。

请参阅官方文档中的以下摘录:

通过按名称比较整个对象的属性,可以断言它们的相等性。即使属性的类型不同,但存在内置转换(通过Convert类),也可以这样做。作为一个例子,考虑来自任意域模型的客户实体及其DTO对应的Customer DTO。您可以使用以下语法断言DTO与实体具有相同的值:

dto.ShouldHave().AllProperties().EqualTo(customer);
只要dto的所有属性在customer上也可用,并且它们的值相等或可转换,断言就会成功。但是,可以使用属性表达式排除特定属性,例如ID属性:

dto.ShouldHave().AllPropertiesBut(d => d.Id).EqualTo(customer);
这相当于:

dto.ShouldHave().AllProperties().But(d => d.Id).EqualTo(customer);
反过来也是可能的。因此,如果您只想包含两个特定属性,请使用以下语法

dto.ShouldHave().Properties(d => d.Name, d => d.Address).EqualTo(customer);
最后,如果您只想比较这两个对象的属性,可以使用SharedProperties()方法,如下所示:

  dto.ShouldHave().SharedProperties().EqualTo(customer);
显然,可以使用But()方法将其链接起来,以排除某些共享属性

此外,通过包含IncludingNestedObjects属性,可以进一步进行结构比较。这将指示比较来比较主题属性(在本例中)引用的所有(集合)复杂类型。默认情况下,它将断言主题的嵌套属性与预期对象的嵌套属性相匹配。但是,如果确实指定了SharedProperties,则它将只比较嵌套对象之间同名的属性。例如:

dto.ShouldHave().SharedProperties().IncludingNestedObjects.EqualTo(customer);

它验证属性是否相等,但不验证类型是否相等这正是您所要求的,不是吗?如果比较同一类的两个实例,为什么要检查类型是否相等?但是我想确定我比较了同一类型的实例,那么我不理解你关于Equals()的评论。使用Equals()时,您永远无法做到这一点。您可以做的是collection.Should()。OnlyContainItemsOfType()。对于未来的读者:请注意,FluentAssertions的API已经更改,现在通过
ShouldBeEquivalentTo(customer,opt=>opt.Excluding(o=>o.Id))