I\'m writing something in the flavour of Enumerable.Where
in that takes a predicate of the form Func
. If the underlying T
Yes, you'll be able to see everything directly referenced. Of course, if someone passes
x => ComputeAge(x) > 18
then you won't necessarily know that ComputeAge
refers to the Age
property.
The expression tree will be an accurate representation of exactly what's in the lambda expression.
Small code example of a visitor that would find directly referenced properties.
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);