gpt4 book ai didi

c# - 获取 LINQ 投影中的属性列表

转载 作者:行者123 更新时间:2023-11-30 23:05:51 26 4
gpt4 key购买 nike

我有以下 LINQ 表达式:

var query = entities
.Select(e => new MyObject()
{
Property1 = e.Item1,
Property2 = e.Item2
});

MyObject 可能还定义了 Property3、Property4。我需要通过表达式访问者了解哪些属性是 LINQ 投影的一部分。

所以我这样调用:

var listOfProperties = query.GetSelectedPropertyNames();

listOfProperties 的内容将是字符串数组,其中包含 Property1、Property2 或我可以检查的内容:

var isPropertyInProjection = query.HasPropertyInProjection(nameof(MyObject.Property3));

结果将为假。

最佳答案

您可以使用 ExpressionVisitor 轻松做到这一点。只需创建一个新类并覆盖访问方法即可。如果您知道投影是使用成员绑定(bind)完成的,您可以简单地覆盖方法 VisitMemberBinding 并将绑定(bind)的成员添加到您存储为实例变量的列表中。然后您需要做的就是公开该实例变量。

class ProjectionAnalyzer : ExpressionVisitor
{
private HashSet<MemberInfo> boundMembers = new HashSet<MemberInfo>();

protected override MemberBinding VisitMemberBinding(MemberBinding node)
{
boundMembers.Add(node.Member);
return base.VisitMemberBinding(node);
}

public IEnumerable<MemberInfo> BoundMembers => boundMembers;
}

然后,按如下方式使用这个类:

var analyzer = new ProjectionAnalyzer();
analyzer.Visit(selectorPredicate);
var boundMembers = analyzer.BoundMembers;

获取选择器谓词的方式取决于您的 LINQ 提供程序。

关于c# - 获取 LINQ 投影中的属性列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48560826/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com