我正在写一些Enumerable.Where
的内容,其中包含Func<T, bool>
形式的谓词。如果基础T
实现INotifyPropertyChanged
,我希望在重新评估谓词方面更加聪明。
我正在考虑将其更改为使用Expression<Func<T, bool>>
,然后使用表达式树找出谓词中使用的属性。然后我可以让我的PropertyChanged
处理程序更加智能化。
我的问题:这可行吗?如果谓词的简单(例如x => x.Age > 18
),则Expression
似乎拥有我需要的所有内容。是否存在我无法查看引用了哪些属性的情况?
答案 0 :(得分:2)
是的,您将能够看到直接引用的所有内容。当然,如果有人通过
x => ComputeAge(x) > 18
那么您不一定知道ComputeAge
是指Age
属性。
表达式树将准确表示lambda表达式中的内容。
答案 1 :(得分:1)
访问者的小代码示例,可以找到直接引用的属性。
public class PropertyAccessFinder : ExpressionVisitor {
private readonly HashSet<PropertyInfo> _properties = new HashSet<PropertyInfo>();
public IEnumerable<PropertyInfo> Properties {
get { return _properties; }
}
protected override Expression VisitMember(MemberExpression node) {
var property = node.Member as PropertyInfo;
if (property != null)
_properties.Add(property);
return base.VisitMember(node);
}
}
// Usage:
var visitor = new PropertyAccessFinder();
visitor.Visit(predicate);
foreach(var prop in visitor.Properties)
Console.WriteLine(prop.Name);