使用 Func<T,bool>[] 作为参数列表并检查每个函数的结果
Use Func<T,bool>[] as a parameter list and check the result for each function
更新:
我正在尝试编写一种方法来完成一些工作,在它真正完成这些工作之前,它需要经过一些验证。这些验证根据要执行的工作而有所不同。
想了想,还是想用同样的模式,稍作改动。
现在,我想让下面的代码工作:
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 的方法。
我应该如何编写代码 以通过函数列表遍历所有结果 return 并确保它们 return 为真,以及保持类型参数的灵活性?
答案:
已找到方法,希望对您有所帮助:
只需将方法定义修改为:
某个班级:
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);
如果有任何其他解决方案,请告诉我。
假设我正确理解了这些类型,我认为这样的事情应该可行:
if (Validations.All(v => v(resource)))
快完成了!
首先注意 Validations
是一个 Func<Request, bool>
的数组——也就是说,数组中的每一项都是一个 函数 ,它需要一个 Request
作为参数和returns a bool
.
因此,为了从 Func
中获取 bool
,您需要将其应用于 Request
对象。在 C# 中,将 Func
应用于参数看起来就像调用方法一样。所以您的 LINQ 表达式将如下所示:
validations.All(f => f(request))
这将 return true
当且仅当 validations
return true
中的所有函数(应用于 request
).
因此您的完整 if
块将如下所示:
// 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
对象,但我相信你能弄清楚。
你不需要在这里使用params
,一个简单的数组就可以了。您可以使用数组传递任意数量的 Func
个对象。
public void DoSomething(Resource resource, Func<Request, bool>[] Validations)
无论如何,您可以轻松地使用 LINQ 的 All
方法来检查数组的所有元素是否都满足谓词。
if (Validations.All(v => v(resource)))
更新: 我正在尝试编写一种方法来完成一些工作,在它真正完成这些工作之前,它需要经过一些验证。这些验证根据要执行的工作而有所不同。
想了想,还是想用同样的模式,稍作改动。 现在,我想让下面的代码工作:
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 的方法。
我应该如何编写代码 以通过函数列表遍历所有结果 return 并确保它们 return 为真,以及保持类型参数的灵活性?
答案:
已找到方法,希望对您有所帮助:
只需将方法定义修改为:
某个班级:
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);
如果有任何其他解决方案,请告诉我。
假设我正确理解了这些类型,我认为这样的事情应该可行:
if (Validations.All(v => v(resource)))
快完成了!
首先注意 Validations
是一个 Func<Request, bool>
的数组——也就是说,数组中的每一项都是一个 函数 ,它需要一个 Request
作为参数和returns a bool
.
因此,为了从 Func
中获取 bool
,您需要将其应用于 Request
对象。在 C# 中,将 Func
应用于参数看起来就像调用方法一样。所以您的 LINQ 表达式将如下所示:
validations.All(f => f(request))
这将 return true
当且仅当 validations
return true
中的所有函数(应用于 request
).
因此您的完整 if
块将如下所示:
// 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
对象,但我相信你能弄清楚。
你不需要在这里使用params
,一个简单的数组就可以了。您可以使用数组传递任意数量的 Func
个对象。
public void DoSomething(Resource resource, Func<Request, bool>[] Validations)
无论如何,您可以轻松地使用 LINQ 的 All
方法来检查数组的所有元素是否都满足谓词。
if (Validations.All(v => v(resource)))