如何获取与 LambdaExpression 中使用的属性对应的变量名称列表?

How to get a list of variable names corresponding to properties used in a LambdaExpression?

我有一个 LambdaExpression,它的 lambda 正文如下:

x => x.FirstName == "Joe" And x.LastName == "Bloggs"

它还可以包含更多属性,它还可以包含 OR 运算符。

如何获取该 lambda 中使用的所有 属性 名称的 List<string>

所以根据上面的 lambda,列表如下所示:

FirstName
LastName 

还有其他 Whosebug 页面以某种方式将它们的 Expression 转换为 MemberExpression,但这对我不起作用,因为它无法正确转换。

我正在尝试做的一个例子就像下面的这个答案,但它返回 PropertyInfo 而不是字符串列表:

Retrieving Property name from lambda expression

.NET提供了一个ExpressionVisitor class that knows how to descend into subexpressions inside the tree. You can inherit from it and override VisitMember来获取树中包含的所有MemberExpression实例,而不关心它们是否通过&&||、[=16组合=]、<、函数调用等

这是一个完整的工作示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;

namespace Rextester
{
    class MemberCollector : ExpressionVisitor
    {
        public HashSet<string> FoundMembers = new HashSet<string>();
        
        override protected Expression VisitMember (MemberExpression node)
        {
            FoundMembers.Add(node.Member.Name);
            return base.VisitMember(node);
        }
    }
    
    public class Program
    {
        public static void Main(string[] args)
        {
            var collector = new MemberCollector();
            Expression<Func<DateTime, bool>> e = dt => dt.Hour == 12 && dt.Minute % 10 == 0;
            collector.Visit(e);
            foreach (var m in collector.FoundMembers)
                Console.WriteLine(m);
        }
    }
}

我没有过滤成员访问,所以除了属性之外,我还会找到字段和方法访问,但这将是对 node.Member.

的直接测试