C# Fluents断言:递归排除字段

C# Fluents断言:递归排除字段,c#,fluent-assertions,C#,Fluent Assertions,例如,我有简单的课程 class Person { public string Name; public string LastName; public Person Parent; public static int IdCounter = 0; public int Id; public Person(string name, string lastName, Person parent) { Name = name; LastN

例如,我有简单的课程

class Person {
   public string Name;
   public string LastName;
   public Person Parent;
   public static int IdCounter = 0;
   public int Id;

   public Person(string name, string lastName, Person parent) {
      Name = name;
      LastName = lastName;
      Parent = parent;
      Id = IdCounter++;
   }
}
在测试中,我想将我从某处得到的人与预期的人进行比较,如下所示:

var expectedPerson=新人(“约翰”、“盖尔基”、新人(“谢尔顿”、“库珀”、空”);
var actualPerson=PersonGenerator.GetCurrentPerson();
我想递归地比较它们,不包括Id字段,这对父母也意味着什么

actualPerson.Should().beeEquivalento(预期人员,(选项)=>
{
选项。排除(t=>t.Id);
});
但ofc这只适用于一级人员,当FluentAssertion可以进入递归(文档中有10个级别)时,我如何排除父级及其父级和e.t.c的Id字段?
在这个例子中,这似乎很不合理,但我需要确切地做到这一点,如何做到这一点?

要递归地排除一个成员,您必须使用模式匹配要排除的成员的路径

例如,您想排除

  • 身份证
  • 父.Id
  • Parent.Parent.Id
由于每个路径都以
Id
结尾,因此您可以使用

排除(ctx=>ctx.SelectedMemberPath.EndsWith(“Id”))
var expectedPerson=新人(“约翰”、“盖尔基”、新人(“谢尔顿”、“库珀”、空”);
var actualPerson=新人(“约翰”、“盖勒基”、新人(“谢尔顿”、“库珀”、空”);
actualPerson.Should().beeEquivalento(expectedPerson,options=>
选项。排除(ctx=>ctx.SelectedMemberPath.EndsWith(“Id”));
请注意,这是纯字符串匹配。 例如,如果另一个成员具有要包括的
Id
属性,则可以使用这种方式确保它仅与根Id或任何Parent.Id匹配

Regex.IsMatch(ctx.SelectedMemberPath, @"^(Parent\.)*Id$")

要递归地排除成员,您必须使用与要排除的成员的路径匹配的模式

例如,您想排除

  • 身份证
  • 父.Id
  • Parent.Parent.Id
由于每个路径都以
Id
结尾,因此您可以使用

排除(ctx=>ctx.SelectedMemberPath.EndsWith(“Id”))
var expectedPerson=新人(“约翰”、“盖尔基”、新人(“谢尔顿”、“库珀”、空”);
var actualPerson=新人(“约翰”、“盖勒基”、新人(“谢尔顿”、“库珀”、空”);
actualPerson.Should().beeEquivalento(expectedPerson,options=>
选项。排除(ctx=>ctx.SelectedMemberPath.EndsWith(“Id”));
请注意,这是纯字符串匹配。 例如,如果另一个成员具有要包括的
Id
属性,则可以使用这种方式确保它仅与根Id或任何Parent.Id匹配

Regex.IsMatch(ctx.SelectedMemberPath, @"^(Parent\.)*Id$")

你期望的结果是什么?你困惑的问题你的预期结果是什么?你的问题令人困惑,谢谢!顺便问一下,这样做是否正确和正常?查看
SelectedMemberPath
排除
重载是进行递归匹配的最佳可用方法。见例。regex示例是我能想到的与
Person.Id
完全匹配的最佳方法,除此之外没有其他方法。谢谢!顺便问一下,这样做是否正确和正常?查看
SelectedMemberPath
排除
重载是进行递归匹配的最佳可用方法。见例。regex示例是我能想到的最好的方法,它可以精确地匹配
Person.Id
,而无需其他任何东西。