如何获取与 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
.
的直接测试
我有一个 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
.