If I had to write an API for this requirement, it would look something like this (pseudocode, Member here is MemberInfo.Member):
public class MemberNode
{
public Member Value { get; }
public List<MemberNode> Children { get; } = new List<MemberNode>();
public MemberNode(Member value)
{
Value = value;
}
}
public static class MemberTreeHelper
{
public static bool IsAncestor(MemberNode root, Member possibleAncestor, Member member)
{
var ancestorNode = FindNode(root, possibleAncestor);
return ancestorNode != null && ContainsDescendant(ancestorNode, member);
}
private static MemberNode FindNode(MemberNode current, Member target)
{
if (current.Value.memberPk.Equals(target.memberPk))
return current;
return current.Children
.Select(child => FindNode(child, target))
.FirstOrDefault(found => found != null);
}
private static bool ContainsDescendant(MemberNode node, Member target)
{
return node.Children.Any(child =>
child.Value.memberPk.Equals(target.memberPk) ||
ContainsDescendant(child, target));
}
}