如何为Func<>表达式动态添加额外参数?代码报错求解决
解决Func<>表达式动态组合的报错问题
嘿,这个问题我之前也碰到过,咱们一步步来理清楚:
错误原因
你写的代码里,char.IsDigit(x)会直接返回一个bool值,但myPredicate是一个**Func<char, bool>委托对象**——它代表的是一个可以接受char参数并返回bool的函数,而不是函数执行后的结果。||运算符只能对两个bool值进行操作,自然就会报“无法应用于bool和Func<char,bool>”的错误啦。
最简单的修复方案
直接调用你的myPredicate委托,把当前的x传进去,这样就能得到对应的bool值,和char.IsDigit(x)的结果做逻辑或:
Func<char, bool> myPredicate = (x) => (char.IsLetter(x) || x == 'X'); // 修复后的代码 "abc".All(x => char.IsDigit(x) || myPredicate(x));
更灵活的动态组合方案
如果你的需求是动态添加多个谓词条件(比如以后还要加更多判断规则),可以封装一个通用的组合方法,这样扩展性更强:
// 通用的谓词组合方法,支持任意类型T的多个Func<T, bool> public static Func<T, bool> CombineOrPredicates<T>(params Func<T, bool>[] predicates) { // 对每个输入x,只要有一个谓词返回true,整体就返回true return x => predicates.Any(pred => pred(x)); }
使用的时候就可以轻松组合多个条件:
Func<char, bool> myPredicate = (x) => (char.IsLetter(x) || x == 'X'); Func<char, bool> digitCheck = x => char.IsDigit(x); // 组合两个谓词 var combinedPredicate = CombineOrPredicates(digitCheck, myPredicate); // 直接传入组合后的委托 "abc".All(combinedPredicate);
这样以后要加新的判断逻辑,只需要新增一个Func<char, bool>,然后传入CombineOrPredicates方法就行,不用修改原有的业务代码。
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

