Чтобы рекурсивно исключить участника, вы должны будете использовать Excluding(Expression<Func<IMemberInfo, bool>> predicate)
, который позволяет вам использовать шаблон, соответствующий пути к исключаемому участнику.
Например, вы хотите исключить
- Id
- Parent.Id
- Parent.Parent.Id
- ...
Поскольку каждый путь заканчиваетсяId
Вы можете использовать
Excluding(ctx => ctx.SelectedMemberPath.EndsWith("Id"))
var expectedPerson = new Person("John", "Galecky", new Person("Sheldon", "Cooper", null));
var actualPerson = new Person("John", "Galecky", new Person("Sheldon", "Cooper", null));
actualPerson.Should().BeEquivalentTo(expectedPerson, options =>
options.Excluding(ctx => ctx.SelectedMemberPath.EndsWith("Id")));
Имейте в виду, что это чистое совпадение строк. Если, например, у другого участника есть свойство Id
, которое вы хотите включить , вы можете использовать этот способ, чтобы убедиться, что он соответствует только корневому идентификатору или любому Parent.Id.
Regex.IsMatch(ctx.SelectedMemberPath, @"^(Parent\.)*Id$")