提问者:小点点

如何基于强加类型的谓词集合过滤对象?


我有一种情况,我想根据强加给其特定类型的谓词集合来过滤对象:这可以通过预编译的ExpressionTrees来完成吗?

class A
{
   public int Value {get;set;}
}
class B
{
  public string Name {get;set;}
  public bool IsMajor{get;set;}
}


Dictionary<Type,IEnumerable<Predicate<[object casted to type]>> typePredicateMap=new Dictionary<Type,Predicate<[object casted to type]>>{
   {typeof(A),new List<Predicate<[object casted to A]> { x=>x.Value >100,x=>x.Value<200 }},
   {typeof(B),new List<Predicate<[object casted to B]> { x=>x.Name!="johhnny",x=>x.IsMajor==true }}
}

我说上面的对象转换为Type,因为我希望我的谓词基于该特定类型...

public static bool MeetsCriteria(object data)
{
    Type type=typeof(data);
    IEnumerable<Predicate<object>predicates=typePredicateMap[type];
    bool isValid=true;
    foreach(var predicate in predicates)
    {
        isValid&=predicate(data);  //
    }
    return isValid;
}

共1个答案

匿名用户

主要问题是,由于我们要动态选择要调用的谓词,因此它们必须是谓词类型。

在实践中,这意味着如果您有一个类A和类B: A,您可以使用谓词

我想这是一种冗长的方式,你只需要使用谓词

我不相信你的要求可以用表达式树来解决,因为类型的问题仍然存在,但是嘿,也许有人会证明我错了。