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

时间:2015-10-13 19:02:45

标签: 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参数的灵活性< /强>

答案:

找到了一种方法,希望这会有所帮助:

只需将方法定义修改为:

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

如果有任何其他解决方案,请告诉我。

3 个答案:

答案 0 :(得分:9)

你几乎就在那里!

首先请注意,ValidationsFunc<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)))