我有一种情况,我想根据强加给其特定类型的谓词集合来过滤对象:这可以通过预编译的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;
}
主要问题是,由于我们要动态选择要调用的谓词,因此它们必须是谓词类型。
在实践中,这意味着如果您有一个类A
和类B: A
,您可以使用谓词
我想这是一种冗长的方式,你只需要使用谓词
我不相信你的要求可以用表达式树来解决,因为类型的问题仍然存在,但是嘿,也许有人会证明我错了。