使用 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)))