gpt4 book ai didi

c# - 如何根据强加类型的谓词集合过滤对象?

转载 作者:行者123 更新时间:2023-11-30 22:51:24 26 4
gpt4 key购买 nike

我有一种情况,我想根据强加于特定类型的谓词集合来过滤对象:这可以通过预编译的 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 }}
}

我在上面说过 object casted to 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;
}

最佳答案

主要问题是因为我们要动态选择要调用的谓词,它们的类型必须是Predicate<object>。 ,因为我们调用它们的类型是 object .由于 Predicate<T>逆变(定义为 Predicate<in T> ),这意味着我们可以为 T 指定派生程度较低的类型,而期望派生程度较高的类型。

实际上这意味着如果你有一个类 A和类 B : A , 你可以使用 Predicate<A>作为Predicate<B>Predicate<object>作为Predicate<A> , 但你不能做 Predicate<A>其中 Predicate<object>是期待。这意味着您的谓词必须是 Predicate<object> 类型并手动将对象参数转换为正确的类型。

我想这是一种冗长的说法,你只需要使用 Predicate<object>无处不在,或者找到一些方法来约束你的输入对象。你的MeetsCriteria方法真的需要处理可能存在的每个对象吗?

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

关于c# - 如何根据强加类型的谓词集合过滤对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59219477/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com