我可以使用Expression <func <t,bool =“”>&gt;并可靠地查看Func中引用了哪些属性<t,bool =“”>?</t,> </func <t,>

时间:2010-09-08 08:44:54

标签: c# linq linq-to-objects

我正在写一些Enumerable.Where的内容,其中包含Func<T, bool>形式的谓词。如果基础T实现INotifyPropertyChanged,我希望在重新评估谓词方面更加聪明。

我正在考虑将其更改为使用Expression<Func<T, bool>>,然后使用表达式树找出谓词中使用的属性。然后我可以让我的PropertyChanged处理程序更加智能化。

我的问题:这可行吗?如果谓词的简单(例如x => x.Age > 18),则Expression似乎拥有我需要的所有内容。是否存在我无法查看引用了哪些属性的情况?

2 个答案:

答案 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);