更新: 我正在尝试编写一种方法来完成一些工作,在它真正完成这些工作之前,它需要经过一些验证。这些验证根据要执行的工作而有所不同。
经过一番思考,我还是想使用相同的模式,稍作改动。 现在,我想让下面的代码工作:
SomeClass:
public SomeResponse DoSomething<T>(params Func<T, bool>[] validations)
{
if(validations.All(v=>v(T))
{
some logic..
}
return SomeResponse;
}
用法:
private Func<SomeRequest, bool> ValidateName = r =>
{return !string.IsNullOrWhiteSpace(r.Name);};
private Func<SomeRequest, bool> ValidatePhone = r =>
{return !string.IsNullOrWhiteSpace(r.Phone);};
var someResponse = SomeClass.DoSomething<SomeRequest>(ValidateName,ValidatePhone);
同样,该代码目前无法正常工作,因为它给了我错误
if(validations.All(v=>v(T))
基本上 Type 参数在这里无效,我找不到将实际的 SomeRequest
对象传递给 Func 的方法。
我应该如何编写代码循环遍历函数列表返回的所有结果并确保它们返回 true,以及保持 Type 参数的灵 active ?
答案:
找到了一种方法,希望这会有所帮助:
只需将方法定义修改为:
一些类:
public SomeResponse DoSomething<T>(T request, params Func<T, bool>[] validations)
{
if(validations.All(v=>v(request))
{
some logic..
}
return SomeResponse;
}
然后像这样使用它:
var someResponse = SomeClass.DoSomething<SomeRequest>(someRequest, ValidateName,ValidatePhone);
请告诉我是否有任何其他解决方案。
最佳答案
你快到了!
首先注意Validations
是 Func<Request, bool>
的数组- 也就是说,数组中的每一项都是一个函数,它接受一个Request
。作为参数并返回 bool
.
所以为了得到bool
来自 Func
,您需要将其应用于 Request
目的。在 C# 中,应用 Func
给一个参数看起来就像调用一个方法。所以您的 LINQ 表达式将如下所示:
validations.All(f => f(request))
这将返回 true
当且仅当 validations
中的所有函数返回 true
(应用于 request
时)。
所以你的完整if
block 将如下所示:
// I'm just guessing what the code to make a Request object will look like
Request request = resource.GetRequest();
if (!validations.All(f => f(request)))
{
throw new Exception("Not all of the validations checked out");
}
您没有提供足够的上下文让我告诉您在哪里可以得到 Request
反对来自,但我相信你能弄明白。
关于c# - 使用 Func<T,bool>[] 作为参数列表并检查每个函数的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33110625/