更新: 我正在尝试编写一个方法来做一些工作,在实际完成这些工作之前,它需要经过一些验证。这些验证取决于它将要做的工作。
经过深思熟虑之后,我仍然希望使用相同的模式并进行一些细微的更改。 现在,我想让以下代码正常工作:
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参数的灵活性< /强>
答案:
找到了一种方法,希望这会有所帮助:
只需将方法定义修改为:
SomeClass的:
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);
如果有任何其他解决方案,请告诉我。
答案 0 :(得分:9)
你几乎就在那里!
首先请注意,Validations
是Func<Request, bool>
的数组 - 也就是说,数组中的每个项目都是函数,它将Request
作为参数并返回bool
。
因此,为了从bool
中获取Func
,您需要将其应用于Request
对象。在C#中,将Func
应用于参数看起来就像调用方法一样。所以你的LINQ表达式将如下所示:
validations.All(f => f(request))
当且仅当true
中的所有功能都返回validations
时(当应用于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
对象,但我相信您可以弄明白。
答案 1 :(得分:0)
假设我正确理解这些类型,我认为这样的事情应该有效:
if (Validations.All(v => v(resource)))
答案 2 :(得分:0)
你不需要在这里使用params
,一个简单的数组就可以。您可以使用数组传递任意数量的Func
个对象。
public void DoSomething(Resource resource, Func<Request, bool>[] Validations)
无论如何,您可以轻松使用LINQ的All
方法来检查数组的所有元素是否满足谓词。
if (Validations.All(v => v(resource)))