代码之家  ›  专栏  ›  技术社区  ›  Roger Lipscombe

我能否使用Expression<Func<T,bool>>并可靠地查看Func<T,bool>中引用了哪些属性?

  •  1
  • Roger Lipscombe  · 技术社区  · 15 年前

    Enumerable.Where 在这种情况下 Func<T, bool> . 如果潜在的 T 工具 INotifyPropertyChanged ,我想在重新计算谓词方面更聪明一点。

    我在考虑把它改成 Expression<Func<T, bool>> ,然后使用表达式树找出谓词中使用的属性。那我就可以拥有我的 PropertyChanged 你应该聪明一点。

    我的问题是:这可行吗?如果谓词很简单(例如。 x => x.Age > 18 ),然后 Expression

    2 回复  |  直到 15 年前
        1
  •  2
  •   Jon Skeet    15 年前

    是的,你可以看到一切 直接地 引用。当然,如果有人经过

    x => ComputeAge(x) > 18
    

    那你就不一定知道了 ComputeAge Age 财产。

        2
  •  1
  •   sisve    15 年前

    一个访问者的小代码示例 引用的属性。

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