c# - 使用 Func<T,bool>[] 作为参数列表并检查每个函数的结果

标签 c# parameter-passing func type-parameter

更新: 我正在尝试编写一种方法来完成一些工作,在它真正完成这些工作之前,它需要经过一些验证。这些验证根据要执行的工作而有所不同。

经过一番思考,我还是想使用相同的模式,稍作改动。 现在,我想让下面的代码工作:

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);

请告诉我是否有任何其他解决方案。

最佳答案

你快到了!

首先注意ValidationsFunc<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/

相关文章:

C#:包装方法调用的优雅方式

ninject - Ninject 是否支持 Func(自动生成工厂)?

c# - 使用 Func 委托(delegate)返回值

c# - sql 列中 10 个最常见的值 - linq to sql

c - 我应该如何将此整数数组传递给这个函数?

c# - 我可以在 C# 中创建经典的 VB 数组吗?

ruby-on-rails - 在 ruby​​ on rails 中将参数从一个 Controller 传递到另一个 Controller

c++ - C++ 编译器实际上如何在引用参数中传递文字常量?

c# - 在 C# 中使用 Linq to SQL 将匿名类型转换为列表 <T>

c# - 在窗体上绘制一条连续的线,例如 Winforms C# 上的 MS paint